Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Mundo Perl » Avanzado » Liberar memoria de procesos en Perl Responder al tema
Nuevo tema


Página 1 de 1  [ 3 mensajes ] 
 
Nota 2011-04-05 12:33 @564

Perlero Nuevo
Registrado: 2010-11-24 18:08 @797
Mensajes: 13
Liberar memoria de procesos en Perl
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:
Syntax: [ Download ] [ Hide ]
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;


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...


Nota 2011-04-05 12:58 @582
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10261
Re: Liberar memoria de procesos en Perl
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
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
undef @vector;


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


Nota 2011-04-06 04:42 @238

Perlero Nuevo
Registrado: 2010-11-24 18:08 @797
Mensajes: 13
Re: Liberar memoria de procesos en Perl
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.


Responder al tema  [ 3 mensajes ] 

Reglas del Foro
No puedes abrir nuevos temas en este Foro
No puedes responder a temas en este Foro
No puedes editar tus mensajes en este Foro
No puedes borrar tus mensajes en este Foro
No puedes enviar adjuntos en este Foro

Publicidad

Socializa

Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Saltar a:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO