Разобрался!!! Оказывается, в отличие от обычных хешей, для tied хешей вызов scalar keys %foo не оптимизирован. Поэтому вместо того, чтобы просто вернуть количество записей, идет перебор и подсчет всех. Читал, что в какой-то базе данных тоже так. или в Постгресс или ИнноДВ.
Вот как оказывается, заменил одну строчку, а какой результат. Как только стал посчитывать сам - все залетало! Интересно, а много еще подводных камней в Perl? А если бы не использовал tie, а напрямую, то не потерял бы 4 дня!!! После этого задумаешься, а стоит смотреть на Moose и прочие штучки. ----- Original Message ----- From: ksvs <[email protected]> To: Moscow.pm group <[email protected]> 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 [email protected] | http://moscow.pm.org -- Moscow.pm mailing list [email protected] | http://moscow.pm.org
