perl memory hash

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



memory (7)

Devel :: Size es la respuesta a tu pregunta. (Tenga en cuenta que Devel :: Size asignará temporalmente una cantidad significativa de memoria al procesar una gran estructura de datos, por lo que no es muy adecuada para este fin).

Sin embargo, Cache :: SizeAwareMemoryCache y Tie :: Cache ya implementan lo que está buscando (con interfaces un tanto diferentes), y podría evitar que reinvente la rueda.

Memoize es un módulo que simplifica el almacenamiento en caché del valor de retorno de una función. No implementa un límite de caché basado en el tamaño, pero debería ser posible utilizar Tie :: Cache como back-end para Memoize.

Tengo un script Perl donde mantengo un caché muy simple usando una tabla hash. Me gustaría borrar el hash una vez que ocupa más de n bytes, para evitar que Perl (32 bits) se quede sin memoria y falle.

Puedo verificar el número de pares de claves y valores:

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

¿Pero es posible verificar la memoria real ocupada por el hash?


Si te preocupa administrar la cantidad de memoria que Perl está usando, probablemente deberías mirar un enfoque alternativo. ¿Por qué necesitas tanto en RAM a la vez? ¿Deberías estar usando algún tipo de sistema de persistencia?


Puede usar Devel :: Size para determinar la memoria utilizada, pero generalmente no puede dar memoria de retorno al sistema operativo. Sin embargo, suena como si estuvieras intentando borrar y reutilizar, lo que debería funcionar bien.

Si el caché es para una función, considere usar el módulo Memoize en lugar de mantener el caché usted mismo. Admite la caducidad de la caché (a través de Memoize :: Expire) para que pueda limitar el tamaño de la caché sin destruirla por completo.


Memoria caché

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 que necesita reinventar, hay un montón de soluciones de almacenamiento en caché simple en CPAN que harán el trabajo muy bien para usted.

Se puede decir a Cache :: SizeAwareMemoryCache el tamaño máximo que quieres que use, luego puedes dejarlo para que te importe el caché.


Está buscando Devel :: Tamaño

NOMBRE

Devel :: Size - Extensión Perl para encontrar el uso de la memoria de las variables de 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);


Puede instalar Devel :: Size para averiguar la memoria tomada por cualquier construcción en Perl. Sin embargo, tenga en cuenta que llevará una gran cantidad de memoria intermedia, por lo que no la usaría contra una gran estructura de datos. Ciertamente no lo haría si crees que puedes estar a punto de quedarte sin memoria.

Por cierto, hay una serie de buenos módulos en CPAN para hacer el almacenamiento en caché en la memoria y de lo contrario. En lugar de rodar el suyo, sugeriría usar uno de ellos en su lugar. Por ejemplo, pruebe Tie :: Cache :: LRU para un caché en memoria que solo irá a un número específico de claves.