[Moscow.pm] tie Berkeley. Разобрался!!!
ksvs
ksvs1996 на ymail.com
Вт Окт 23 23:02:11 PDT 2012
Разобрался!!!
Оказывается, в отличие от обычных хешей, для tied хешей вызов
scalar keys %foo не оптимизирован. Поэтому вместо того, чтобы просто вернуть количество записей, идет перебор и подсчет всех.
Читал, что в какой-то базе данных тоже так. или в Постгресс или ИнноДВ.
Вот как оказывается, заменил одну строчку, а какой результат.
Как только стал посчитывать сам - все залетало!
Интересно, а много еще подводных камней в Perl?
А если бы не использовал tie, а напрямую, то не потерял бы 4 дня!!!
После этого задумаешься, а стоит смотреть на Moose и прочие штучки.
----- Original Message -----
From: ksvs <ksvs1996 на ymail.com>
To: Moscow.pm group <moscow-pm на pm.org>
Cc:
Sent: Tuesday, 23 October 2012, 9:07
Subject: Re: [Moscow.pm] tie Berkeley
> Даже интересно стало. Вот что я сделал:
> https://gist.github.com/3933779
> и убил свою ZFS на фряхе )))
>
> Она все же пишет на диск, не знаю куда, но много.
> В gist'е последний результат которого я смог дождаться 1500000
> элементов в хеше...
>
> А вот, когда я сделал
> tie %h1, 'BerkeleyDB::Hash', -Cachesize => 700_000_000; # поставить
> cache в 700Mb
>
> Процесс в памяти занял больше, но мучения диска начались только вот тут:
> 100000 5378313/s 223696/s
> 300000 5378313/s 231981/s
> 700000 5474182/s 233712/s
> 1500000 5296201/s 233712/s
> 3100000 5064251/s 235469/s
> 6300000 5420331/s 233712/s
А я сделал замеры скорости программы от размера кеша:
когда перловый кеш, то примерно О(1), когда Берклевский, то О(n)!
Тю, а я не догадался, что можно Берклей без файла использовать.
Просто сделал файл на /tmp, а /tmp у меня в памяти сделаны.
P.S. У меня тоже FreeBSD :-)
--
Moscow.pm mailing list
moscow-pm на pm.org | http://moscow.pm.org
Подробная информация о списке рассылки Moscow-pm