Как парсить IPGeoBase?

12
lstaticl
На сайте с 07.02.2008
Offline
82
2877

Предыстория: Пишу свою ТДС, для определения геоположения посетителя нужна база IP с гео привязкой. Базу решил брать ipgeobase.

Проблема: Как за минимальное время определить принадлежность поданного на вход IP к какому-либо региону?

У меня пока получается:

Берем левую и правую границу диапазона, проходим по всей базе и находим минимальный отступ нашего адреса от левой и правой границ. Считаем, что минимум - это и есть тот дипазон которому принадлежит данный адрес.

В базе 130к записей - следовательно такой процесс занимает не менее 3-4 сек. Хотелось бы свести время хотябы до 1сек, а лучше 0,5сек.

Как по-другому можно парсить?

Хочу выиграть MacBook (http://contest.adkeeper.ru)
[Удален]
#1
lstaticl:
В базе 130к записей - следовательно такой процесс занимает не менее 3-4 сек. Хотелось бы свести время хотябы до 1сек, а лучше 0,5сек.

ну у вас и проблемы .... ну да, базы - вещь с которой НЕ СЛЕДУЕТ начинать ...

начинать надо с алгоритмов и их реализаций..

вот вам например мои рассуждения старые по теме гео, база правда моя страдает, но если сильно надо будет мне, то я сделаю из ipgeobase базу которая будет обладать моментальным временем поиска.

http://hell.helldude.ru/archives/59

зы: индексы в таблице проставьте и пересмотрите запросы на предмет использования индексов

[umka]
На сайте с 25.05.2008
Offline
456
#2

Я на одном сайтике применяю базу MaxMind с городами там вообще хз какое количество записей и работает всё очень шустро!

Вся база в одном файлике.

Применяется бинарный поиск по индексу, т.к. ip-адрес — это по большому счету целое число.

Учитывая то, что айпишники объединяются по маске, то длина поиска сокращается до размера подсети.

А в этой базе как организовано?

Или там всё в MySQL? )

Лог в помощь!
lstaticl
На сайте с 07.02.2008
Offline
82
#3

Обрезание не очень пойдет. Есть вероятность, что диапазон который вырезали не имеется в точно таком виде в Базе. Наример:

У нас адрес: 62.220.34.168;

Получаем диапазон: 62.220.34.0 - 62.220.34.255;

В базе есть:

1) 62.220.0.0 - 62.220.38.255

2) 62.220.31.0 - 62.220.36.255

3) 62.220.37.0 - 62.220.37.255

4) 62.220.38.0 - 62.220.38.255

2,3,4 - входят в 1й. НО наш диапазон входит в 2, не в явном виде. Посему выйдет косяк :)

T.R.O.N
На сайте с 18.05.2004
Offline
314
#4
lstaticl:
Как за минимальное время определить принадлежность поданного на вход IP к какому-либо региону?

Что для Вас регион? Просто центр-восток-запад-... , фед. округа, нужен город точно?

Базу нужно привести к виду, который нужен вам. Убрав разбивку на операторов и т.д. + собрав диапазоны воедино и убрать возможные дубли. Нет желания юзать мускул, оставьте грамотный текст. после оптимизации, строк в файле будет столько, сколько регионов в итоге Вас интересует.

Просто не нужно с молотком идти на стену.

От воздержания пока никто не умер. Хотя никто и не родился! Prototype.js был написан теми, кто не знает JavaScript, для тех, кто не знает JavaScript (Richard Cornford)
N
На сайте с 06.05.2007
Offline
419
#5

maxmind все равно быстрее. там по-моему диапазоны не пересекаются.

ну если сильно хочется - так сделайте чтобы в вашей базе тоже не пересекались диапазоны путем разбиения вложенных блоков на несколько и решайте уже другую простую задачу.

Кнопка вызова админа ()
lstaticl
На сайте с 07.02.2008
Offline
82
#6

Всем спасибо за ответы. Про "Убрать разбивку на операторов" я уже думал. Есть 1 минус. Когда я обновлю базу, придется опять эту разбивку убирать и т.д.

maxmind все равно быстрее

По отзывам у maxmind плохое качество для РУ-траффа

Brand from Amber
На сайте с 18.08.2007
Offline
293
#7

lstaticl, откуда 4-ре секунды?

  • SELECT count(*) FROM ipgeo - 237659 (т.е. моя поболе будет)
  • SELECT * FROM ipgeo WHERE SIPINT<=1334562353 AND EIPINT>=1334562353 LIMIT 1
  • 79.139.192.0 - 79.139.255.255, RU, Russian Federation, Москва, Москва, Центральный, Moscow Local Telephone Network (OAO MGTS)

Итог: полная информация (включая не только регион но и провайдера) менее чем за 4-ре секунды.

Лучший способ понять что-то самому - объяснить это другому.
lstaticl
На сайте с 07.02.2008
Offline
82
#8
Brand from Amber:
lstaticl, откуда 4-ре секунды?

  • SELECT count(*) FROM ipgeo - 237659 (т.е. моя поболе будет)
  • SELECT * FROM ipgeo WHERE SIPINT<=1334562353 AND EIPINT>=1334562353 LIMIT 1

Итог: полная информация (включая не только регион но и провайдера) менее чем за 4-ре секунды.

У меня без SQL, только по оригинальному файлу.

Ink-developer
На сайте с 31.01.2009
Offline
138
#9

Писал аналогичный скрипт. Суть была в том что файл конвертировал и сохранял в формате:

214324232354.342545345345.Россия

343243243243.454354354334.Украина

затем простым циклом пробегаешся по массиву и узнаеш какой стране пренадлежит IP

for($i=0;$i<$count;$i++){

list($ip_1,$ip_2,$strana)=explode(".",$file[$i]);

if($ip>=$ip_1 && $ip<=$ip_2){

$country=$strana;

break;

}

}

в итоге проверка моментальная.

Pan Russian
На сайте с 12.01.2006
Offline
122
#10
lstaticl:

По отзывам у maxmind плохое качество для РУ-траффа

лучшее решение по Российским IP

База + скрипты

http://ipgeobase.ru/cgi-bin/Archive.cgi

http://ipgeobase.ru/cgi-bin/Software.cgi

Во вложении php скрипт

zip ip.zip
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий