Pergunta

Eu tenho um script Perl onde eu manter um cache muito simples usando uma tabela hash. Gostaria de limpar o hash, uma vez que ocupa mais de n bytes, para evitar Perl (32-bit) a falta de memória e cair.

Eu posso fazer uma verificação sobre o número de pares de chaves de valor:

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

Mas é possível verificar a memória real ocupada pelo hash?

Foi útil?

Solução

Devel :: Size é a resposta à sua pergunta. (Note-se que Devel :: Size vai atribuir temporariamente uma quantidade significativa de memória ao processar uma estrutura de dados grande, por isso não é muito bem adequado para esta finalidade.)

No entanto, Cache :: SizeAwareMemoryCache e Tie :: cache já implementar o que você está procurando (com interfaces tanto diferentes), e poderia salvá-lo de reinventar a roda.

Memoize é um módulo que torna mais simples para armazenar em cache o valor de retorno de uma função. Ele não implementa um limite de cache baseado em tamanho, mas deve ser possível usar Tie :: Cache como um backend para Memoize.

Outras dicas

Você está procurando Devel :: Size

NAME

Devel :: Size - extensão Perl para encontrar o uso de memória de variáveis ??Perl

Sinopse

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

Você pode instalar Devel :: Size para descobrir a memória ocupada por qualquer construto em Perl. No entanto não estar ciente de que ele terá uma grande quantidade de memória intermediária, que eu não iria usá-lo contra uma estrutura de dados grande. Eu certamente não iria fazê-lo se você acha que pode estar prestes a ficar sem memória.

BTW, há uma série de bons módulos no CPAN para fazer cache na memória e de outra forma. Em vez de rolar seus próprios, sugiro usar um deles em seu lugar. Por exemplo tente Tie :: Cache :: LRU para uma in- cache de memória que só vai até um determinado número de chaves.

Você pode usar Devel :: Size para determinar a memória usada, mas você não pode geralmente dão memória retorno ao oS. Parece que você está apenas tentando limpar e reutilizar, porém, que deve funcionar bem.

Se o cache é para uma função, considere usar o Memoize módulo em vez de manter o armazenar em cache si mesmo. Ele suporta expiração de cache (via Memoize :: expirar), assim você pode limitar o tamanho do cache sem destruí-la por completo.

Se você está se preocupando sobre como gerenciar a quantidade de memória que Perl está usando, você provavelmente deve olhar para uma abordagem alternativa. Por que você precisa tanto em RAM de uma só vez? Você deve estar usando algum tipo de sistema de persistência?

Cache :: Memória

use Cache::Memory;

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

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

Como já foi dito, o cache não é uma roda que você precisa re-inventar, há uma abundância de soluções de cache simples no CPAN que irá fazer o trabalho muito bem para você.

Cache :: SizeAwareMemoryCache pode ser dito o tamanho máximo que você quer que ele uso, então você pode deixá-lo para se preocupar com o cache para você.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top