<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
</head>
<body bgcolor="#FFFFFF" text="#000000">
Есть трехмагабайтный список формата<br>
ip/bitmask $category<br>
Например<br>
1.2.3.4/24 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>
Какие еще есть альтернативы?<br>
<br>
<pre class="moz-signature" cols="72">--
Best Regards,
Nick Knutov
<a class="moz-txt-link-freetext" href="http://knutov.com">http://knutov.com</a>
ICQ: 272873706
Voice: +7-904-84-23-130 </pre>
</body>
</html>