2012-09-27 19 views
5

Tengo que enfrentar un problema extraño al manejar la memoria en Perl. Estoy trabajando en una aplicación de Perl que usa estructuras de hash bastante grandes. Estoy asignando el tiene objetos de ref hacia atrás. Pero al final parece que incluso si estoy desasignando el objeto y el hash, el uso de la memoria sigue siendo el mismo.Administración de memoria en Perl

Este es un ejemplo del problema:

my $hash = {}; 
............. 
this ds gets populated with a lot of data ... 
....... 
{ 
     my $obj = new Class("data"=>$hash); 
....... 
....... 
...... 

} 

#even undefing the $hash 
undef $hash; 

# I can expect some improvement in Memory Utilization, but its not happening 

Creo que estoy haciendo algunos errores muy básicos. ¿Puede alguien sugerir?

Respuesta

3

En términos generales, la gestión de memoria Perl hace lo que tiene que hacer, y usted no necesita preocuparse por ello. Por ejemplo, ¿cuál es el daño de mantener una gran cantidad de memoria asignada para el resto de su programa? Probablemente ninguno. Perl lo liberará si su sistema operativo está en peligro de quedarse sin memoria.

Supongamos que tiene algún caso especial, como un script que se ejecuta constantemente en segundo plano, pero ocasionalmente necesita hacer una tarea que requiere mucha memoria. Puede resolver esto separándolo en dos scripts: background.pl y memory-intensive-task.pl. El archivo background.pl ejecutará memory -intensive-task.pl cuando sea necesario. La memoria se liberaría cuando este programa se complete y salga.

12

No se puede devolver la memoria al sistema operativo. Perl usualmente lo mantendrá para reasignarlo más tarde, aunque se acumulará basura de vez en cuando.

Ver http://learn.perl.org/faq/perlfaq3.html#How-can-I-free-an-array-or-hash-so-my-program-shrinks-

y

http://clokwork.net/2012/02/12/memory-management-in-perl/

+0

¿Qué sucede en caso de objetos? Cuando un objeto sale del alcance, se llama al destructor. ¿Esto mantendrá la memoria de las variables léxicas definidas en el objeto? – Kallol

+0

@Kallol, ese caso no es diferente de una variable normal que está fuera del alcance, excepto que puede hacer una limpieza personalizada de su objeto. La memoria * será * libre para que Perl la use para otra cosa, pero Perl aún no la devolverá al sistema. – dan1111

+0

¿qué tipo de limpieza de custome se puede hacer? – Kallol

Cuestiones relacionadas