[caracas-pm] Liberar memoria con undef (?)
Luis Muñoz
lem at itverx.com.ve
Thu Dec 3 10:39:19 PST 2015
On 3 Dec 2015, at 10:12, Alberto Mijares wrote:
> No dudo que se haya destruido el arreglo (aunque no lo he probado)
> pero ¿por qué no se libera la memoria?
Hay dos factores en juego:
(a) Perl puede haber destruido el arreglo, pero no necesariamente le
“devolverá” la memoria al sistema usando la llamada free(3)…
(b) … aun haciéndolo, el manejo de memoria de *nix no es capaz de
reducir la asignación de memoria de un proceso. Esto es, el proceso
puede crecer pero no reducirse.
La razón para (b) es que en un sistema con memoria virtual —
esencialmente cualquier sistema contemporáneo — la asignación de
memoria real vs virtual es arbitraria. Puedes tener un proceso con
varios Gb de memoria virtual que en realidad, sólo consume pocos Mb de
memoria real. El recurso escaso es la memoria real, no la virtual.
Las razones para (a) pueden ser un poco más complejas. En general
tienen que ver con cuánto más rápido puede ser el procesamiento si es
el propio Perl quien administra su memoria vs malloc(3)/free(3) en el
sistema anfitrión.
Como regla general, no puedes reducir el tamaño de un proceso. Lo que
puedes hacer es un fork(), de manera que el hijo haga el cómputo que
requiere la gran cantidad de memoria, pase el resultado al padre y
muera. Eso sí permite que la memoria se libere. Alternativamente tal
vez exista una forma más conservadora en memoria de hacer el trabajo
que requieres.
Saludos
-lem
More information about the caracas-pm
mailing list