Взял на себя смелость поискать за вас в гугле по запросу "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
