2012-01-19 11 views
5

Mi código es el siguiente: el uso de memoriaCómo liberar memoria en Perl?

my %var; 
my %var_new={}; 

while(1){ 
    while(my ($k,$v)=each %var){ 
      &a_sub($v); 
    } 
    %var={}; # A 
    map { $var{$_}=$var_new{$_}; } keys %var_new; 
    %var_new={}; # B 
} 

sub a_sub { #....} # will fill %var_new 

Mi programa de sube y sube.

Parece Perl no liberar memoria en las líneas A y B.

¿Cómo puedo realizar manualmente Perl para liberar la memoria utilizada %var y %var_new?

+4

¿Por qué asigna un hashref a un hash? – Quentin

+8

'use strict; usa advertencias; use diagnostics' (este último solo durante el desarrollo) – Quentin

+0

A pesar de los errores en el código que ha publicado, no hay ninguna razón para que el código que publique use cada vez más memoria. – ikegami

Respuesta

7

IIRC, una vez Perl ha asignado la memoria del sistema operativo, que se aferra a que la memoria para la vida del proceso. Siempre que sea posible, Perl reutilizará la memoria que ya ha asignado en lugar de pedir más al sistema operativo, pero no verá la memoria utilizada por un proceso de disminución.

+1

Lo que dices es cierto en la práctica, pero Perl * puede * realmente devolver memoria al sistema operativo. Otra cuestión es si eso es deseable en el caso general. – tsee

+0

¿Cómo liberar forzosamente la memoria no utilizada al sistema operativo? – Artem

+0

Sí. Una vez que la memoria un proceso asigna memoria desde el SO, la retendrá hasta el final de su vida útil. Sucede con cualquier idioma, no solo con Perl. Dijo que, si Perl se compila para usar mmap en lugar de su propio malloc, esa memoria se puede liberar siempre que no se use por completo. – Luchostein

1

creo que el uso de la función undef:

undef %var, %var_new; 

puede hacer el truco. Eso es, por supuesto, si usted no necesita lo que hay dentro de esos valores hash más

+0

Establecer '% var' y'% var_new' en '{}' debe tener el mismo efecto. –

+0

No es así. Inspeccionar con Devel :: Peek. – daxim

+5

@KeithThompson No, establecer '% var' y'% var_new' en '()' debe tener el mismo efecto. – Stamm

13

Si se hubiera usado strict y warnings, que habría visto:

Referencia encuentra en la lista de tamaño uniforme espera

Las líneas A y B no hacen lo que usted piensa que hacen. De hecho, asignan como clave la versión codificada de una referencia a un hash vacío, y undef como su valor. Incluso si el hash ahora está casi vacío, la memoria no está marcada como reutilizable porque no usó la declaración adecuada para eso.

tratar de utilizar una de las siguientes afirmaciones sobre las líneas A y B:

undef %var; # this one 
%var =(); # or this one 
Cuestiones relacionadas