Как найти объем физической памяти, занимаемый хэшем в Perl?

StackOverflow https://stackoverflow.com/questions/106555

  •  01-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

Вы ищете Разработка:: Размер

Имя

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);

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

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

Вы можете использовать Разработка:: Размер чтобы определить используемую память, но обычно вы не можете вернуть память операционной системе.Звучит так, будто вы просто пытаетесь очистить и повторно использовать, что должно сработать нормально.

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

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

Кэш::Память

use Cache::Memory;

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

my $size  = $cache->size()
my $limit = $cache->size_limit();

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top