powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Пятничная оптимизация
21 сообщений из 21, страница 1 из 1
Пятничная оптимизация
    #36780097
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть база 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.
"1038267904","1038268159","TW","TAIWAN","T'AI-PEI","TAIPEI","25.017","121.45","CHTD CHUNGHWA TELECOM CO. LTD","HINET.NET"
"1038268160","1038269183","TW","TAIWAN","-","-","25.017","121.45","CHTD CHUNGHWA TELECOM CO. LTD","HINET.NET"
"1038269184","1038269439","TW","TAIWAN","T'AI-PEI","TAIPEI","25.017","121.45","CHTD CHUNGHWA TELECOM CO. LTD","HINET.NET"
"1038269440","1038271999","TW","TAIWAN","-","-","25.017","121.45","CHTD CHUNGHWA TELECOM CO. LTD","HINET.NET"
"1038272000","1038272767","TW","TAIWAN","T'AI-PEI","TAIPEI","25.017","121.45","CHTD CHUNGHWA TELECOM CO. LTD","HINET.NET"
"1038272768","1038279167","TW","TAIWAN","-","-","25.017","121.45","CHTD CHUNGHWA TELECOM CO. LTD","HINET.NET"
"1038279168","1038279423","TW","TAIWAN","T'AI-PEI","TAIPEI","25.017","121.45","CHTD CHUNGHWA TELECOM CO. LTD","HINET.NET"
"1038279424","1038291199","TW","TAIWAN","-","-","25.017","121.45","CHTD CHUNGHWA TELECOM CO. LTD","HINET.NET"

Использование в БД - как-то некрасиво. Индексы дают логарифмическое время поиска и кроме того неэффективно работают с интервалами.

Я ищу время поиска близкое к константе и реализацию - в виде C++ библиотеки.

Делитесь мыслями. Я приветствую мозговой штурм.
...
Рейтинг: 0 / 0
Пятничная оптимизация
    #36780102
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ ищу время поиска близкое к константеувы, при таких требованиях на ум приходит только libastral...
...
Рейтинг: 0 / 0
Пятничная оптимизация
    #36780111
Фотография k0rvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гм... использовать ипы в качестве индексов массива? правда массив получается весьма большой.

у хеш-таблиц какое время доступа?
...
Рейтинг: 0 / 0
Пятничная оптимизация
    #36780117
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
k0rvinгм... использовать ипы в качестве индексов массива? правда массив получается весьма большой.

у хеш-таблиц какое время доступа?
При отсутствии промахов - константа. Теория говорит, что правильно выбранное соотношение ключей/элементов гарантирует попадание практически в 99.9%.
...
Рейтинг: 0 / 0
Пятничная оптимизация
    #36780119
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirmaytonЯ ищу время поиска близкое к константеувы, при таких требованиях на ум приходит только libastral...
Спасибо, я там уже был.
...
Рейтинг: 0 / 0
Пятничная оптимизация
    #36780204
netwind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, зачем текстовый файл, если с geoip прилагается библиотека для работы с бинарным файлом?
она уделает все, что бы вы там ни придумали. за исключением специальных вырожденных случаев, типа определения страны по смещению в большом промаппленом в память файле.
судя по полям у вас какая-то комбинированная база. вроде такую maxmind не раздает, а раздает несколько разных.
...
Рейтинг: 0 / 0
Пятничная оптимизация
    #36780213
netwind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, и с базой не так все страшно,как вы думаете
все там вполне эффективно, при некоторых ухищрениях
http://sql.ru/forum/actualthread.aspx?tid=772393
...
Рейтинг: 0 / 0
Пятничная оптимизация
    #36780215
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
mayton,

БерклиДБ.
в чистом виде: хэш-значение.
...
Рейтинг: 0 / 0
Пятничная оптимизация
    #36780217
netwind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, кстати если вы сможете собрать под win msvc эту библиотеку собрать нормально - расскажите как и чем.
там в maxmind настолько юникс-ориентированные программисты, что у меня ничего не получилось. хотя я и не практикующий программист, чтобы глубоко покопаться.
...
Рейтинг: 0 / 0
Пятничная оптимизация
    #36780221
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Моя мысль - в другом направлении. Как оптимально искать интервалы (отрезки) в диапазоне DWORD ? GeoIP - всего-лишь практическое применение. Я пока не собираюсь устраивать бенчмарки я-vs-maxmind. Интерес - в поиске подходящего метода индексирования.
...
Рейтинг: 0 / 0
Пятничная оптимизация
    #36780225
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netwindкстати, и с базой не так все страшно,как вы думаете
все там вполне эффективно, при некоторых ухищрениях
http://sql.ru/forum/actualthread.aspx?tid=772393
Я понял направление. Вы думаете что RDBMS оптимально исполнит это?

?tid=772393EXPLAIN SELECT * FROM GeoIP WHERE startIpNum <=1834451198 AND endIpNum >=1834451198

Я к сожалению не умею интерпретировать планы MySQL, но если просветите, что делает ядро исполняющей машины для такого курсора - буду рад.
...
Рейтинг: 0 / 0
Пятничная оптимизация
    #36780231
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eNosemayton,

БерклиДБ.
в чистом виде: хэш-значение.
(отхлёбывая пиво)

Я тоже думал о Бекли. Это всего-лишь исполняющая машина которая юзает алгоритмы поиска Hash и BTree. Но эффективность решения в базе Беркли будет СИЛЬНО зависеть от того в КАКОМ ВИДЕ мы подадим на вход значения пары IP_FROM - IP_TO.

Есть конечно тривиальное решение. Все четыре миллиарда IP номеров забиваем ключами в хеш-таблицу. Но это оверхедно по памяти и глуповато. Мы не учитывает кусочно-линейный характер данных.

Кроме того, как быть с IPv6 в подобном примере. Я, как видите, смотрю в будущее...
...
Рейтинг: 0 / 0
Пятничная оптимизация
    #36780234
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
maytonEXPLAIN SELECT * FROM GeoIP WHERE startIpNum <=1834451198 AND endIpNum >=1834451198
в оракле:
INDEX (UNIQUE SCAN)--PK_1 (UNIQUE)
...
Рейтинг: 0 / 0
Пятничная оптимизация
    #36780235
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
да, забыл. coast 1
...
Рейтинг: 0 / 0
Пятничная оптимизация
    #36780236
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
то есть если оптимизатор написан нормально, то он это преобразует в единственное условие "=".
...
Рейтинг: 0 / 0
Пятничная оптимизация
    #36780243
netwind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, рассуждать об общих случаях совсем неинтересно. Интересные оптимизации появляются, когда известно что-то еще о данных. Например, округление. Без существенного ухудшения точности, можно эту базу "округлить", обозначив в одной байте целых 256 ip адресов и код страны от 0 до 255.
получится файл на 16 мб. Проецировать его в память и читать байт как массив. Вероятно, это самый быстрый прикладной способ определения страны по таким базам.

Из того, что мне удалось узнать о бинарном формате maxmind, они называют его дерево остатков - radix tree. Они хранят подобным образом не только страну, но и кучу информации, причем двоичным редактором там не просматривается текст, а значит используется какая-то упаковка префиксов.

Я cчитаю, что использование субд тут вполне допустимо.
В том примере mysql использует сбалансированное бинарное дерево (да как и все субд).
там план mysql плохой и неоптимистичный, а вот по фактическому счетчику элементарных операций (show session status like 'handler%';) он очень хорош оказывается, потому что limit 1. На счетчике лишь две операции позиционирования по индексу. А по логике должна быть одна. Думаю, это там в моем инструметарии dbforge studio ошибка. Там есть тонкие моменты и dbforge могли ошибиться.
...
Рейтинг: 0 / 0
Пятничная оптимизация
    #36780248
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да. Я думал об этом. Надо поисследовать как диапазоны адресов распределены по сегментам. Всегда-ли он отображается 1:1. Если это так - то алгоритм действительно сильно упощается.

Эххх... придётся всё-таки грузануть это в базу.

Ладно. Всем - до завтра.
...
Рейтинг: 0 / 0
Пятничная оптимизация
    #36780261
Фотография k0rvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЕсть конечно тривиальное решение. Все четыре миллиарда IP номеров забиваем ключами в хеш-таблицу. Но это оверхедно по памяти и глуповато. Мы не учитывает кусочно-линейный характер данных.

Кроме того, как быть с IPv6 в подобном примере. Я, как видите, смотрю в будущее...

зачем все? в том-то и отличие хеш-таблицы от вектора, что мы забиваем только нужные, но как Вы же написали, гарантии константного доступа нет, в отличие от вектора
...
Рейтинг: 0 / 0
Пятничная оптимизация
    #36780262
netwind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, не понял о чем вы, но диапазоны там не пересекаются - инфа 100%.
radix tree создано для экономии места,поэтому если вы программируете на C++ какой-то софт не привязанный к субд, объем бинарной базы может оказаться настолько маленьким, что она вся или самые горячие ее участки (а участки такие обязательно будут) поместится в память. Уж точно будет меньше по сравнению с субд.
Как я уже говорил, лучше всего будет использовать их библиотеку.
...
Рейтинг: 0 / 0
Пятничная оптимизация
    #36780430
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диапазоны вроде-бы не пересекаются. Но сегменты сеток не такие ровные. Или мне по крайней мере в некоторых Locations не удаётся выделить диапазон хостов так гладко, как пишут в умных книжках по проектированию сетей.
...
Рейтинг: 0 / 0
Пятничная оптимизация
    #36780432
netwind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, они объединили рядом стоящие "ровные" сети. с точки зрения из api ровные сети совсем не нужны .
надеюсь, вы там не программный маршрутизатор IP собрались писать :)
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Пятничная оптимизация
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]