From amijaresp at gmail.com Thu Dec 3 10:12:02 2015 From: amijaresp at gmail.com (Alberto Mijares) Date: Thu, 3 Dec 2015 13:42:02 -0430 Subject: [caracas-pm] Liberar memoria con undef (?) Message-ID: Hola lista, un gusto saludarlos: Hice una pruebita para comprobar una hip?tesis y no tuve el resultado esperado. Tengo un programita donde se contruye un array considerablemente grande; pero despu?s de usarlo quisiera destruirlo y liberar esa memoria utilizada mientras se termina de ejecutar el programa. Pens? que con undef @array; pod?a lograrse lo que quer?a. As? que hice un one-liner para si efectivamente funcionaba. $ perl -E '$t="A"x1024;for(1..50000){push(@t,$t);};say"revisa";sleep(10);undef(@t);say"revisa";sleep(10);' Viendo la ejecuci?n del programa con top(1), se supone que despu?s que dice "revisa" la segunda vez debo ver menos memoria utilizada, pero no. Los valores tanto de SIZE como de RES permanecen iguales. No dudo que se haya destruido el arreglo (aunque no lo he probado) pero ?por qu? no se libera la memoria? Gracias de antemano. Saludos Alberto Mijares From juan.paredes at gmail.com Thu Dec 3 10:46:22 2015 From: juan.paredes at gmail.com (Juan Miguel Paredes) Date: Thu, 3 Dec 2015 14:16:22 -0430 Subject: [caracas-pm] Liberar memoria con undef (?) In-Reply-To: References: Message-ID: 2015-12-03 13:42 GMT-04:30 Alberto Mijares : > > Tengo un programita donde se contruye un array considerablemente > grande; pero despu?s de usarlo quisiera destruirlo y liberar esa > memoria utilizada mientras se termina de ejecutar el programa. > > Pens? que con > > undef @array; > > pod?a lograrse lo que quer?a Como dicen las referencias, con undef s?lo lograr?as que la memoria utilizada por la lista pueda ser reutilizada _dentro_ de tu programa por otras estructuras, pero no para el sistema operativo. Algunos han sugerido estrategias como la de hacer "fork" o de que el programa reinicie su ejecuci?n con "exec", pero esto ya depender?a en mucho del caso de uso espec?fico, si realmente es lo que quieres. [1] http://learn.perl.org/faq/perlfaq3.html#How-can-I-free-an-array-or-hash-so-my-program-shrinks [2] http://www.perlmonks.org/?node_id=182343 -------------- next part -------------- An HTML attachment was scrubbed... URL: From lem at itverx.com.ve Thu Dec 3 10:39:19 2015 From: lem at itverx.com.ve (Luis =?utf-8?q?Mu=C3=B1oz?=) Date: Thu, 03 Dec 2015 10:39:19 -0800 Subject: [caracas-pm] Liberar memoria con undef (?) In-Reply-To: References: Message-ID: 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 From francisco at obispo.link Thu Dec 3 10:58:52 2015 From: francisco at obispo.link (Francisco Obispo) Date: Thu, 03 Dec 2015 10:58:52 -0800 Subject: [caracas-pm] Liberar memoria con undef (?) In-Reply-To: References: Message-ID: <83893D25-6C83-4037-AB5A-B52582DE5E5F@obispo.link> Puedes liberar la memoria con die() Es decir, el proceso va a liberar la memoria (a.k.a. `free()`) pero eso no le va a devolver la memoria al kernel. Solo terminando el proceso se logra eso. saludos On 3 Dec 2015, at 10:12, Alberto Mijares wrote: > Hola lista, un gusto saludarlos: > > Hice una pruebita para comprobar una hip?tesis y no tuve el resultado esperado. > > Tengo un programita donde se contruye un array considerablemente > grande; pero despu?s de usarlo quisiera destruirlo y liberar esa > memoria utilizada mientras se termina de ejecutar el programa. > > Pens? que con > > undef @array; > > pod?a lograrse lo que quer?a. As? que hice un one-liner para si > efectivamente funcionaba. > > $ perl -E '$t="A"x1024;for(1..50000){push(@t,$t);};say"revisa";sleep(10);undef(@t);say"revisa";sleep(10);' > > > Viendo la ejecuci?n del programa con top(1), se supone que despu?s que > dice "revisa" la segunda vez debo ver menos memoria utilizada, pero > no. Los valores tanto de SIZE como de RES permanecen iguales. > > No dudo que se haya destruido el arreglo (aunque no lo he probado) > pero ?por qu? no se libera la memoria? > > Gracias de antemano. > > Saludos > > > Alberto Mijares > _______________________________________________ > caracas-pm mailing list > caracas-pm at pm.org > http://mail.pm.org/mailman/listinfo/caracas-pm -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 841 bytes Desc: OpenPGP digital signature URL: From amijaresp at gmail.com Thu Dec 3 11:19:12 2015 From: amijaresp at gmail.com (Alberto Mijares) Date: Thu, 3 Dec 2015 14:49:12 -0430 Subject: [caracas-pm] Liberar memoria con undef (?) In-Reply-To: <83893D25-6C83-4037-AB5A-B52582DE5E5F@obispo.link> References: <83893D25-6C83-4037-AB5A-B52582DE5E5F@obispo.link> Message-ID: Bien. Muchas gracias por las explicaciones y referencias, me qued? claro. Por los momentos, me conformo con saber que la memoria queda disponible dentro del mismo proceso, as? no sea devuelta al sistema operativo. Saludos Alberto Mijares 2015-12-03 14:28 GMT-04:30 Francisco Obispo : > Puedes liberar la memoria con die() > > Es decir, el proceso va a liberar la memoria (a.k.a. free()) pero eso no le > va a devolver la memoria al kernel. Solo terminando el proceso se logra eso. > > saludos > > On 3 Dec 2015, at 10:12, Alberto Mijares wrote: > > Hola lista, un gusto saludarlos: > > Hice una pruebita para comprobar una hip?tesis y no tuve el resultado > esperado. > > Tengo un programita donde se contruye un array considerablemente > grande; pero despu?s de usarlo quisiera destruirlo y liberar esa > memoria utilizada mientras se termina de ejecutar el programa. > > Pens? que con > > undef @array; > > pod?a lograrse lo que quer?a. As? que hice un one-liner para si > efectivamente funcionaba. > > $ perl -E > '$t="A"x1024;for(1..50000){push(@t,$t);};say"revisa";sleep(10);undef(@t);say"revisa";sleep(10);' > > Viendo la ejecuci?n del programa con top(1), se supone que despu?s que > dice "revisa" la segunda vez debo ver menos memoria utilizada, pero > no. Los valores tanto de SIZE como de RES permanecen iguales. > > No dudo que se haya destruido el arreglo (aunque no lo he probado) > pero ?por qu? no se libera la memoria? > > Gracias de antemano. > > Saludos > > Alberto Mijares > > ________________________________ > > caracas-pm mailing list > caracas-pm at pm.org > http://mail.pm.org/mailman/listinfo/caracas-pm From lem at itverx.com.ve Thu Dec 3 11:21:23 2015 From: lem at itverx.com.ve (Luis =?utf-8?q?Mu=C3=B1oz?=) Date: Thu, 03 Dec 2015 11:21:23 -0800 Subject: [caracas-pm] Liberar memoria con undef (?) In-Reply-To: References: <83893D25-6C83-4037-AB5A-B52582DE5E5F@obispo.link> Message-ID: <4F92ECCE-A32C-4817-A107-5519A515BF2D@itverx.com.ve> On 3 Dec 2015, at 11:19, Alberto Mijares wrote: > Por los momentos, me conformo con saber que la memoria queda > disponible dentro del mismo proceso, as? no sea devuelta al sistema > operativo. M?s aun, si el proceso ?no la toca m?s?, el sistema la pagina liberando la memoria f?sica para que otro proceso pueda usarla. En muchos casos, no tienes que preocuparte por eso. -lem