Взял на себя смелость поискать за вас в гугле по запросу  "Longest prefix
matching". Мне показалась интересной реализация на основе bloom filter
структуры -
http://conferences.sigcomm.org/sigcomm/2003/papers/p201-dharmapurikar.pdf

4 апреля 2015 г., 17:14 пользователь Nick Knutov <[email protected]> написал:

>  Есть трехмагабайтный список формата
> ip/bitmask $category
> Например
> 1.2.3.4/24 5
>
> Требуется по ип очень быстро получить $class.
> использую Net::Subnet.
>
> Сделал для каждой строчки
> # собираем хеш $cat->@networks
> push @{$reverse_cat->{$cat}}, $ip_mask;
>
> # Для каждого блока делаем subnet_matcher (памяти много)
> our $matcher;
> foreach ( keys $reverse_cat ) {
>     $matcher->{$_} = subnet_matcher @{$reverse_cat->{$_}};
> }
>
> # для каждого запроса возвращаем категорию если ип попал в матчер
> foreach ( keys $matcher ) {
>     return $_ if $matcher->{$_}->($ip);
> }
>
> Когда исходный файл с категориями на 200к строчек - все это работает
> недостаточно быстро.
>
> Вопрос - чем бы это заменить?
>
> Как из моего списока ип сетей сделать бинарную базу для Geo::IP я не смог
> нагуглить (и вообще и с учетом того, что по запросу надо получать именно
> нашу категорию, которая сейчас число, а не двухбуквенный код).
>
> На сайте Geo::IP в разделе про CSV базы предложен вариант с хранением
> структуры в мускульной базе, но для наших нагрузок оно так же будет
> недостаточно быстрым.
>
> Какие еще есть альтернативы?
>
> --
> Best Regards,
> Nick Knutovhttp://knutov.com
> ICQ: 272873706
> Voice: +7-904-84-23-130
>
>
> --
> Moscow.pm mailing list
> [email protected] | http://moscow.pm.org
>
>
-- 
Moscow.pm mailing list
[email protected] | http://moscow.pm.org

Ответить