Cómo averiguar la cantidad de memoria física ocupada por un valor de hash en Perl?

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

  •  01-07-2019
  •  | 
  •  

Pregunta

Tengo un script en Perl que donde yo mantengo una muy simple caché utilizando una tabla hash.Me gustaría aclarar el hash de una vez ocupa más de n bytes, para evitar Perl (32-bits) que se ejecute fuera de la memoria y estrellarse.

Puedo hacer una verificación en el número de teclas de pares de valores:

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

Pero, ¿es posible comprobar la memoria real ocupado por el hash?

¿Fue útil?

Solución

Devel::Tamaño es la respuesta a su pregunta.(Tenga en cuenta que Devel::Tamaño de asignar temporalmente una cantidad significativa de memoria al procesar una gran estructura de datos, así que no es realmente adecuado para este propósito).

Sin embargo, Cache::SizeAwareMemoryCache y Empate::Cache ya poner en práctica lo que estás buscando (con un poco diferentes interfaces), y podría salvarte de tener que reinventar la rueda.

Memoize es un módulo que hace que sea sencillo para almacenar el valor de retorno de una función.No implementar un tamaño de caché de límite, pero debe ser posible el uso de la Corbata::Cache como un backend para Memoize.

Otros consejos

Estás buscando Devel::Tamaño

NOMBRE

Devel::Tamaño - extensión de Perl para encontrar el uso de la memoria de variables en Perl

SINOPSIS

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

Usted puede instalar Devel::Tamaño para averiguar la memoria realizada por cualquier construir en Perl.Sin embargo, ser consciente de que tendrá una gran cantidad de memoria intermedia, así que yo no la usaría en contra de una gran estructura de datos.Yo no lo duda es si usted cree que puede estar a punto de quedarse fuera de la memoria.

Por CIERTO, hay un buen número de los módulos de CPAN para hacer el almacenamiento en caché en la memoria y lo contrario.En lugar de rodar su propio yo sugeriría el uso de uno de ellos en su lugar.Por ejemplo, trate de Empate::Cache::LRU para una caché en memoria, que sólo le van a un número especificado de teclas.

Puede utilizar Devel::Tamaño para determinar la memoria utilizada, pero que generalmente no dar vuelta memoria para el sistema operativo.Suena como que usted está tratando de borrar y reutilizar, sin embargo, que debería funcionar bien.

Si la memoria caché es una función, considere el uso de la Memoize módulo en lugar de mantener la caché de sí mismo.Se admite la caducidad de la caché (a través de Memoize::Caducidad) para que pueda limitar el tamaño de la caché sin destruirla completamente.

Si usted es preocuparse de la gestión de la cantidad de memoria que Perl está utilizando, usted probablemente debería buscar en un enfoque alternativo.¿Por qué se necesita tanto en la memoria RAM de todos a la vez?Si usted utiliza algún tipo de persistencia del sistema?

Cache::Memoria

use Cache::Memory;

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

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

Como otros han dicho, el almacenamiento en caché no es una rueda, es necesario re-inventar, hay un montón de simples soluciones de almacenamiento en CPAN que va a hacer el trabajo muy bien para usted.

Cache::SizeAwareMemoryCache puede ser dijo el máximo tamaño que desea utilizar, entonces usted puede dejar de preocuparse por la memoria caché para usted.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top