• Publicidad

Liberar memoria de procesos en Perl

Así que programas sin strict y las expresiones regulares son otro modo de hablar. Aquí encontrarás respuestas de nivel avanzado, no recomendable para los débiles de corazón.

Liberar memoria de procesos en Perl

Notapor Leotrillo » 2011-04-05 12:33 @564

Hola, estoy teniendo problemas con un pl que hace de servidor de peticiones, cuantas más hace más memoria ocupa y no encuentro la forma de liberar la memoria que va usando, por ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         $i=0;
  2.         my @vector=();
  3.         while($i<500000){
  4.                 push(@vector,'vicente');
  5.                 $i++;
  6.          }
  7.          print="@vector[500]";
  8.          @vector=();
  9.          map { undef $$_; } @vector;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Aquí relleno un vector y cuantos más registros más memoria usa, pero ¿cómo se puede ir liberando en Perl la memoria que usa un pl? Nótese que he inicializado las variables y aun así la memoria se queda ahí sin liberar.

Muchas gracias...
Leotrillo
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2010-11-24 18:08 @797

Publicidad

Re: Liberar memoria de procesos en Perl

Notapor explorer » 2011-04-05 12:58 @582

Perl suele quedarse con la memoria que va ocupando, pues no sabe si la va a necesitar varias veces a lo largo de la ejecución del programa.

También depende mucho del sistema operativo y de la versión Perl que estés usando. ¿Cuáles son?

Un array es un sistema muy efectivo para guardar una pila de información, pero si usas un array con "huecos" (índices del array sin usar), en esos casos, en algunas aplicaciones es mejor usar un hash.

Si tú, como programador, quieres decirle a Perl que quieres que ese array se quede a como estaba en su declaración (que no contenga nada de nada), debes poner
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
undef @vector;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Comentarios a tu código:
my @vector=(); es lo mismo que my @vector;

@vector=(); no "elimina" ni "libera" la memoria del array, sino que le estamos diciendo que queremos que @vector sea un array de cero elementos (no tiene elementos, pero sigue siendo un array con "algo").

print="@vector[500]"; contiene dos errores: el '=' y el '@'.

Después de hacer el map{} de todos los elementos a undef(), seguimos teniendo un array de n elementos (los mismos que antes), pero todos con valor undef (vamos, que no estamos recortando el número de elementos).

Editado: Al final de este hilo (perlmonks.org) te dan una explicación mucho más detallada del proceso de liberación, que depende del tamaño de bloque que se pueda liberar. Pone el siguiente ejemplo: si reservas un bloque de 100MB, es candidato a ser liberado en cuanto deje de ser usado. Pero si reservas 100MB en bloques de 100 bytes, no será liberado nunca.

Pero lo principal es usar variables léxicas locales con my() dentro de los contextos que las necesitan, pues, cuando se terminan esos contextos, son candidatos a ser liberados por el recolector de basura.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Liberar memoria de procesos en Perl

Notapor Leotrillo » 2011-04-06 04:42 @238

Muchas gracias por la explicación, está muy completa :-)

Voy a ver el tema del undef() a ver si consigo liberar parte de la memoria usada.
Leotrillo
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2010-11-24 18:08 @797


Volver a Avanzado

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 5 invitados