[Moscow.pm] perl method "between"

Ivan B. Serezhkin ivan на serezhkin.com
Вс Фев 17 10:50:11 PST 2008


Kaltashkin Eugene wrote:
> Ivan B. Serezhkin пишет:
>   
>> Привет.
>> Боюсь тебе тут надо смотреть всторону BDB.
>> Фишка в том, что такой поиск надо делать на даных, которые лежат в деревьях.
>> Можешь конечно сам сделать хэши хэшей - но это неправильное решение.
>> Вообщем выборку по времени bdb делает влёт, и по ip кажется тоже.
>> Можешь ещё попробовать с libalias повозится? но к ней вроде нет 
>> перлового фронтенда.
>>   
>>     
> В общем пришлось написать нормализатор базы GeoIP в формат 
> p5-Net-Patricia, расковыряв ipcalc.
> На PIII-800 даёт fetch примерно в 45000 записей/сек, на P4-2.8 даёт 
> примерно 150.000 зап/сек.
> В принципе приемлемо и быстрее чем SQL в глобальной групповой выборке.
> http://zhecka.323f.net.ru/server/17.02.2008/stat.html
>
> А есть метод быстрого lookup в массиве между соседними значениями без 
> перебора всего массива ?
>   
Ну у тебя же индекс в массиве есть, +1 и -1 работают наура =)
> или скажем если я вдруг сделаю хеш диапазонов и захочу быстро проверить 
> где значение ключа меньше или больше
> требуемого значения. Что-то я запутался малька :(
>   
Вот дополнительный массив к массиву с значениями - это будет нормально, 
типа список всех мест с диапазонами.
это тебязаметно ускорит.
типа в одном массиве @A=1 2 3 4 5 ...
а в другом @index=(0,10,20,30...)
и когда ты ищешь, ты сначала
делаешь
my $value =105;# ищем значение 105
my $i=$index[$value / 10]; # в индексе все значения поделены скажем на 
10, чтобы прыгать десятками.
while($A[$i] != #search_value) {
    $i++;
}
вот можно так.

> Или если попробовать описать это в виде структуры ?
> $array{$net}->{$subnet}->{$subsubnet} насколько я потеряю в скорости при 
> разименовании хеша ?
>   
Меньше, чем при переборе всех значений массива.
но если тебе нужно обойти их все - то затормозит в фиксированное число раз.

-- 
Ivan B. Serezhkin



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