|
|
|
Пятничная оптимизация
|
|||
|---|---|---|---|
|
#18+
Есть база IP2Location. Пока - в текстовом файле. Возникла мысль, как-бы ускорить по ней поиск. Т.е. стоит задача - по заданному IP адресу найти локацию как можно быстрее. Описание полей: FIELD # FIELD NAME DATA TYPE FIELD DESCRIPTION1 IP_FROM NUMERICAL (DOUBLE)Beginning of IP address range. The data is represented in IP number1 format.2IP_TO NUMERICAL (DOUBLE)Ending of IP address range. The data is represented in IP number1 format.3 COUNTRY_CODE CHAR(2) Two-character country code based on ISO 3166.4 COUNTRY_NAME VARCHAR(64) Country name based on ISO 3166.5 REGION VARCHAR(128) Region name.6 CITY VARCHAR(128) City name.7 LATITUDE NUMERICAL (DOUBLE) City latitude. Default to capital city latitude if city is unknown. 8 LONGITUDE NUMERICAL (DOUBLE) City longitude. Default to capital city longitude if city is unknown.9 ISP_NAME VARCHAR(256) Internet Service Provider registered under the IP address range.10 DOMAIN_NAME VARCHAR(128) Domain name assigned to Internet network. Вот фрагмент таблицы локаций Код: plaintext 1. 2. 3. 4. 5. 6. 7. Использование в БД - как-то некрасиво. Индексы дают логарифмическое время поиска и кроме того неэффективно работают с интервалами. Я ищу время поиска близкое к константе и реализацию - в виде C++ библиотеки. Делитесь мыслями. Я приветствую мозговой штурм. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2010, 19:14 |
|
||
|
Пятничная оптимизация
|
|||
|---|---|---|---|
|
#18+
maytonЯ ищу время поиска близкое к константеувы, при таких требованиях на ум приходит только libastral... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2010, 19:16 |
|
||
|
Пятничная оптимизация
|
|||
|---|---|---|---|
|
#18+
гм... использовать ипы в качестве индексов массива? правда массив получается весьма большой. у хеш-таблиц какое время доступа? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2010, 19:20 |
|
||
|
Пятничная оптимизация
|
|||
|---|---|---|---|
|
#18+
k0rvinгм... использовать ипы в качестве индексов массива? правда массив получается весьма большой. у хеш-таблиц какое время доступа? При отсутствии промахов - константа. Теория говорит, что правильно выбранное соотношение ключей/элементов гарантирует попадание практически в 99.9%. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2010, 19:26 |
|
||
|
Пятничная оптимизация
|
|||
|---|---|---|---|
|
#18+
tanglirmaytonЯ ищу время поиска близкое к константеувы, при таких требованиях на ум приходит только libastral... Спасибо, я там уже был. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2010, 19:27 |
|
||
|
Пятничная оптимизация
|
|||
|---|---|---|---|
|
#18+
mayton, зачем текстовый файл, если с geoip прилагается библиотека для работы с бинарным файлом? она уделает все, что бы вы там ни придумали. за исключением специальных вырожденных случаев, типа определения страны по смещению в большом промаппленом в память файле. судя по полям у вас какая-то комбинированная база. вроде такую maxmind не раздает, а раздает несколько разных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2010, 20:53 |
|
||
|
Пятничная оптимизация
|
|||
|---|---|---|---|
|
#18+
кстати, и с базой не так все страшно,как вы думаете все там вполне эффективно, при некоторых ухищрениях http://sql.ru/forum/actualthread.aspx?tid=772393 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2010, 21:02 |
|
||
|
Пятничная оптимизация
|
|||
|---|---|---|---|
|
#18+
mayton, БерклиДБ. в чистом виде: хэш-значение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2010, 21:05 |
|
||
|
Пятничная оптимизация
|
|||
|---|---|---|---|
|
#18+
mayton, кстати если вы сможете собрать под win msvc эту библиотеку собрать нормально - расскажите как и чем. там в maxmind настолько юникс-ориентированные программисты, что у меня ничего не получилось. хотя я и не практикующий программист, чтобы глубоко покопаться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2010, 21:06 |
|
||
|
Пятничная оптимизация
|
|||
|---|---|---|---|
|
#18+
Моя мысль - в другом направлении. Как оптимально искать интервалы (отрезки) в диапазоне DWORD ? GeoIP - всего-лишь практическое применение. Я пока не собираюсь устраивать бенчмарки я-vs-maxmind. Интерес - в поиске подходящего метода индексирования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2010, 21:10 |
|
||
|
Пятничная оптимизация
|
|||
|---|---|---|---|
|
#18+
netwindкстати, и с базой не так все страшно,как вы думаете все там вполне эффективно, при некоторых ухищрениях http://sql.ru/forum/actualthread.aspx?tid=772393 Я понял направление. Вы думаете что RDBMS оптимально исполнит это? ?tid=772393EXPLAIN SELECT * FROM GeoIP WHERE startIpNum <=1834451198 AND endIpNum >=1834451198 Я к сожалению не умею интерпретировать планы MySQL, но если просветите, что делает ядро исполняющей машины для такого курсора - буду рад. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2010, 21:15 |
|
||
|
Пятничная оптимизация
|
|||
|---|---|---|---|
|
#18+
eNosemayton, БерклиДБ. в чистом виде: хэш-значение. (отхлёбывая пиво) Я тоже думал о Бекли. Это всего-лишь исполняющая машина которая юзает алгоритмы поиска Hash и BTree. Но эффективность решения в базе Беркли будет СИЛЬНО зависеть от того в КАКОМ ВИДЕ мы подадим на вход значения пары IP_FROM - IP_TO. Есть конечно тривиальное решение. Все четыре миллиарда IP номеров забиваем ключами в хеш-таблицу. Но это оверхедно по памяти и глуповато. Мы не учитывает кусочно-линейный характер данных. Кроме того, как быть с IPv6 в подобном примере. Я, как видите, смотрю в будущее... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2010, 21:21 |
|
||
|
Пятничная оптимизация
|
|||
|---|---|---|---|
|
#18+
maytonEXPLAIN SELECT * FROM GeoIP WHERE startIpNum <=1834451198 AND endIpNum >=1834451198 в оракле: INDEX (UNIQUE SCAN)--PK_1 (UNIQUE) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2010, 21:24 |
|
||
|
Пятничная оптимизация
|
|||
|---|---|---|---|
|
#18+
да, забыл. coast 1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2010, 21:25 |
|
||
|
Пятничная оптимизация
|
|||
|---|---|---|---|
|
#18+
то есть если оптимизатор написан нормально, то он это преобразует в единственное условие "=". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2010, 21:26 |
|
||
|
Пятничная оптимизация
|
|||
|---|---|---|---|
|
#18+
mayton, рассуждать об общих случаях совсем неинтересно. Интересные оптимизации появляются, когда известно что-то еще о данных. Например, округление. Без существенного ухудшения точности, можно эту базу "округлить", обозначив в одной байте целых 256 ip адресов и код страны от 0 до 255. получится файл на 16 мб. Проецировать его в память и читать байт как массив. Вероятно, это самый быстрый прикладной способ определения страны по таким базам. Из того, что мне удалось узнать о бинарном формате maxmind, они называют его дерево остатков - radix tree. Они хранят подобным образом не только страну, но и кучу информации, причем двоичным редактором там не просматривается текст, а значит используется какая-то упаковка префиксов. Я cчитаю, что использование субд тут вполне допустимо. В том примере mysql использует сбалансированное бинарное дерево (да как и все субд). там план mysql плохой и неоптимистичный, а вот по фактическому счетчику элементарных операций (show session status like 'handler%';) он очень хорош оказывается, потому что limit 1. На счетчике лишь две операции позиционирования по индексу. А по логике должна быть одна. Думаю, это там в моем инструметарии dbforge studio ошибка. Там есть тонкие моменты и dbforge могли ошибиться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2010, 21:33 |
|
||
|
Пятничная оптимизация
|
|||
|---|---|---|---|
|
#18+
Да. Я думал об этом. Надо поисследовать как диапазоны адресов распределены по сегментам. Всегда-ли он отображается 1:1. Если это так - то алгоритм действительно сильно упощается. Эххх... придётся всё-таки грузануть это в базу. Ладно. Всем - до завтра. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2010, 21:39 |
|
||
|
Пятничная оптимизация
|
|||
|---|---|---|---|
|
#18+
maytonЕсть конечно тривиальное решение. Все четыре миллиарда IP номеров забиваем ключами в хеш-таблицу. Но это оверхедно по памяти и глуповато. Мы не учитывает кусочно-линейный характер данных. Кроме того, как быть с IPv6 в подобном примере. Я, как видите, смотрю в будущее... зачем все? в том-то и отличие хеш-таблицы от вектора, что мы забиваем только нужные, но как Вы же написали, гарантии константного доступа нет, в отличие от вектора ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2010, 21:56 |
|
||
|
Пятничная оптимизация
|
|||
|---|---|---|---|
|
#18+
mayton, не понял о чем вы, но диапазоны там не пересекаются - инфа 100%. radix tree создано для экономии места,поэтому если вы программируете на C++ какой-то софт не привязанный к субд, объем бинарной базы может оказаться настолько маленьким, что она вся или самые горячие ее участки (а участки такие обязательно будут) поместится в память. Уж точно будет меньше по сравнению с субд. Как я уже говорил, лучше всего будет использовать их библиотеку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2010, 21:57 |
|
||
|
Пятничная оптимизация
|
|||
|---|---|---|---|
|
#18+
Диапазоны вроде-бы не пересекаются. Но сегменты сеток не такие ровные. Или мне по крайней мере в некоторых Locations не удаётся выделить диапазон хостов так гладко, как пишут в умных книжках по проектированию сетей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2010, 08:38 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=36780234&tid=1343534]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
176ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 214ms |
| total: | 488ms |

| 0 / 0 |
