[Moscow.pm] Большой битовый массив
Vladimir Timofeev
vovkasm на gmail.com
Пт Авг 3 15:46:02 PDT 2012
3 августа 2012 г., 9:56 пользователь Михаил Монашёв
<postmaster на softsearch.ru> написал:
> Здравствуйте.
>
> Есть несколько миллионов чисел в диапазоне от 0 до 2 в 32 степени
> минус 1 . Нужно быстро проверять, есть такое число или нету. Если
> засунуть их в битовый массив, то они все влезут в 16 мегабайт. Вопрос
> в том, каким модулем пользоваться для записи/чтения в этот битовый
> массив, чтобы было быстро и при этом не раздувалось в памяти более
> 20-30 мегабайт? Или может проще самому через substr + побитовые ИЛИ/И
> реализовать чзапись/чтение?
Мне кажется, вам может подойти Judy ;-)
https://gist.github.com/3252244
Тут тест... памяти такой массив занимает 13Мб на 4 с небольшим млн
элементов битовых, скорость доступа достаточно высока.
Я сравнивал не с вектором (который по памяти проигрывает, а с хешом
перловым), вот вывод у меня дома:
$ perl test.pl
fill array...
done...
Judy stats:
Count all: 4297124
Count (<=10000): 10
MemUsage: 13115440
benchmark tests...
Benchmark: running Hash, Judy for at least 2 CPU seconds...
Hash: 2 wallclock secs ( 2.10 usr + 0.00 sys = 2.10 CPU) @
1963552.36/s (n=4126528)
Judy: 2 wallclock secs ( 2.00 usr + 0.00 sys = 2.00 CPU) @
2505395.00/s (n=5010790)
Вообще в продакшн, я этим модулем не пользовался, как-то не
требовалось до сих пор, так что мемлики, треды и т.п. желательно
потестить.
--
Vladimir Timofeev <vovkasm на gmail.com>
Подробная информация о списке рассылки Moscow-pm