<div dir="ltr">Взял на себя смелость поискать за вас в гугле по запросу  "Longest prefix matching". Мне показалась интересной реализация на основе bloom filter структуры - <a href="http://conferences.sigcomm.org/sigcomm/2003/papers/p201-dharmapurikar.pdf">http://conferences.sigcomm.org/sigcomm/2003/papers/p201-dharmapurikar.pdf</a></div><div class="gmail_extra"><br><div class="gmail_quote">4 апреля 2015 г., 17:14 пользователь Nick Knutov <span dir="ltr"><<a href="mailto:mail@knutov.com" target="_blank">mail@knutov.com</a>></span> написал:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
  

    
  
  <div bgcolor="#FFFFFF" text="#000000">
    Есть трехмагабайтный список формата<br>
    ip/bitmask $category<br>
    Например<br>
    <a href="http://1.2.3.4/24" target="_blank">1.2.3.4/24</a> 5<br>
    <br>
    Требуется по ип очень быстро получить $class.<br>
    использую Net::Subnet.<br>
    <br>
    Сделал для каждой строчки <br>
    # собираем хеш $cat->@networks<br>
    push @{$reverse_cat->{$cat}}, $ip_mask;<br>
    <br>
    # Для каждого блока делаем subnet_matcher (памяти много)<br>
    our $matcher;<br>
    foreach ( keys $reverse_cat ) {<br>
        $matcher->{$_} = subnet_matcher @{$reverse_cat->{$_}};<br>
    }<br>
    <br>
    <big># для каждого запроса </big>возвращаем категорию если ип попал
    в матчер<br>
    foreach ( keys $matcher ) {<br>
        return $_ if $matcher->{$_}->($ip);<br>
    }<br>
    <br>
    Когда исходный файл с категориями на 200к строчек - все это работает
    недостаточно быстро.<br>
    <br>
    Вопрос - чем бы это заменить?<br>
    <br>
    Как из моего списока ип сетей сделать бинарную базу для Geo::IP я не
    смог нагуглить (и вообще и с учетом того, что по запросу надо
    получать именно нашу категорию, которая сейчас число, а не
    двухбуквенный код).<br>
    <br>
    На сайте Geo::IP в разделе про CSV базы предложен вариант с
    хранением структуры в мускульной базе, но для наших нагрузок оно так
    же будет недостаточно быстрым.<br>
    <br>
    Какие еще есть альтернативы?<span class="HOEnZb"><font color="#888888"><br>
    <br>
    <pre cols="72">-- 
Best Regards,
Nick Knutov
<a href="http://knutov.com" target="_blank">http://knutov.com</a>
ICQ: 272873706
Voice: <a href="tel:%2B7-904-84-23-130" value="+79048423130" target="_blank">+7-904-84-23-130</a> </pre>
  </font></span></div>

<br>--<br>
Moscow.pm mailing list<br>
<a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" target="_blank">http://moscow.pm.org</a><br>
<br></blockquote></div><br></div>