[Moscow.pm] Алтернатива subnet_matcher

Nick Knutov mail на knutov.com
Сб Апр 4 07:14:06 PDT 2015


Есть трехмагабайтный список формата
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 Knutov
http://knutov.com
ICQ: 272873706
Voice: +7-904-84-23-130 

----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20150404/04680f16/attachment.html>


Подробная информация о списке рассылки Moscow-pm