> У меня есть гео-база c неперескающимися интервалами ip-адресов в виде
> двух 4-х байтных чисел и кода страны. Я её сконвертил в вид:
> xx.xx.xx.xx\xx . Я брал каждый интервал и спомощью Net::Netmask на
> перле конвертировал в 1 или несколько записей вида xx.xx.xx.xx\xx .
> Размер файла получился 2 мега с копейками или около 100тыс. записей.
>
> Вопрос: как мне этот файл уменьшить, ведь сейчас в нём много
> избыточных данных, которые можно объединить. Есть готовое решение, а
> то mod_geo раздувает процессы Апача до 20 мегов?
Можно сшивать соседние блоки с одинаковой нетмаской если у них одинаковый
код страны. При этом вложенность - допускается.
Т.е:
10.0.0.0/8 US
10.128.0.0/9 ZA
11.0.0.0/8 US
можно склеить в
10.0.0.0/7 US
10.128.0.0/9 ZA
Далее - рекурскивно.
Простейший алгоритм, нифига не эффективный, но сходящийся максимум за
32 итерации:
a) сортируем все по IP (началу диапазона)
б) склеиваем все подходящие /32 в /31 (отличающиеся 32-м битом и с одинаковым
кодом страны), затем /31 в /30 и так далее.
При этом маски у склеиваемых должны быть одинаковыми.
Алексей Тутубалин
mailto: lexa@xxxxxxx
Web: http://www.lexa.ru/lexa