On 04.04.2015 17:14, Nick Knutov wrote:
Есть трехмагабайтный список формата
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


Привет.
я юзаю Patricia. быстрее её Radix Tree ничего не будет.
-- 
Moscow.pm mailing list
[email protected] | http://moscow.pm.org

Ответить