Как найти объем физической памяти, занимаемый хешем в Perl? - PullRequest
17 голосов
/ 20 сентября 2008

У меня есть Perl-скрипт, в котором я поддерживаю очень простой кеш, используя хеш-таблицу. Я хотел бы очистить хеш, если он занимает более n байтов, чтобы избежать исчерпания памяти и сбоя Perl (32-бит)

Я могу проверить количество пар ключ-значение:

if (scalar keys %cache > $maxSize)
 {
 %cache = ();
 }

Но возможно ли проверить фактическую память, занятую хешем?

Ответы [ 7 ]

27 голосов
/ 20 сентября 2008

Devel :: Size - это ответ на ваш вопрос. (Обратите внимание, что Devel :: Size будет временно выделять значительный объем памяти при обработке большой структуры данных, поэтому он не очень подходит для этой цели.)

Однако Cache :: SizeAwareMemoryCache и Tie :: Cache уже реализуют то, что вы ищете (с несколько другими интерфейсами), и могут спасти вас от повторного изобретения колеса.

Memoize - это модуль, упрощающий кеширование возвращаемого значения из функции. Он не реализует ограничение размера кэша на основе размера, но должна быть возможность использовать Tie :: Cache в качестве бэкенда для Memoize.

11 голосов
/ 20 сентября 2008

Вы ищете Devel :: Размер

ИМЯ

Devel :: Size - расширение Perl для определения использования памяти переменных Perl

СИНТАКСИС

use Devel::Size qw(size total_size);

my $size = size("A string");
my @foo = (1, 2, 3, 4, 5);
my $other_size = size(\@foo);
my $foo = {a => [1, 2, 3],
        b => {a => [1, 3, 4]}
       };
my $total_size = total_size($foo);
5 голосов
/ 20 сентября 2008

Вы можете установить Devel :: Size , чтобы узнать объем памяти, занятый любой конструкцией в Perl. Однако имейте в виду, что это займет большой объем промежуточной памяти, поэтому я не буду использовать ее для большой структуры данных. Я бы, конечно, не сделал бы этого, если бы вы думали, что вам может не хватить памяти.

Кстати, на CPAN есть несколько хороших модулей для кеширования в памяти и в других случаях. Вместо того, чтобы бросать свои собственные, я бы предложил использовать один из них. Например, попробуйте Tie :: Cache :: LRU для кэша в памяти, который будет использовать только указанное количество ключей.

2 голосов
/ 20 сентября 2008

Вы можете использовать Devel :: Size для определения используемой памяти, но обычно вы не можете вернуть память операционной системе. Похоже, вы просто пытаетесь очистить и использовать повторно, что должно работать нормально.

Если кеш предназначен для функции, рассмотрите возможность использования модуля Memoize вместо обслуживания кеша самостоятельно. Он поддерживает срок действия кэша (через Memoize :: Expire), поэтому вы можете ограничить размер кэша, не разрушая его полностью.

1 голос
/ 22 сентября 2008

Если вы беспокоитесь об управлении объемом памяти, который использует Perl, вам, вероятно, следует рассмотреть альтернативный подход. Зачем вам столько памяти одновременно? Вы должны использовать какую-то систему персистентности?

1 голос
/ 20 сентября 2008

Cache :: Память

use Cache::Memory;

my $cache = Cache::Memory->new(
  namespace => 'MyNamespace',
  default_expires => '600 sec'
);

my $size  = $cache->size()
my $limit = $cache->size_limit();
0 голосов
/ 08 декабря 2008

Как уже говорили другие, кеширование - это не то колесо, которое вам нужно заново изобретать, на CPAN есть множество простых решений для кеширования, которые отлично подойдут для вас.

Cache :: SizeAwareMemoryCache можно указать максимальный размер, который вы хотите использовать, затем вы можете оставить его, чтобы заботиться о кэше для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...