[Python] Garbage collection

Daniele Varrazzo piro a develer.com
Mar 30 Mar 2010 13:04:25 CEST


On Tue, 30 Mar 2010 12:19:58 +0200, Pietro Battiston <toobaz a email.it>
wrote:
> Salve a tutti,
> 
> per quel che ne so, in python 2.5 e successivi il garbage collector
> dovrebbe esistere e funzionare, giusto?
> 
> Sapreste spiegarmi perché allora, se io faccio un import del seguente
> semplice modulo:
> 
>
http://bazaar.launchpad.net/~tv-player-team/tv-player/GTK-release-0.3/annotate/head%3A/libradiotv/rai_XML.py
> 
> e poi do "del rai_XML", python continua ad occupare 50 MB?

Prima del gc c'e' il ref count: devi avere 0 riferimenti al tuo modulo
prima che abbia una chance di essere cancellato. Qualunque altro modulo lo
importi aggiunge un riferimento. C'e' anche il riferimento in sys.modules
come ti hanno gia' detto. Puoi sapere quanti sono i ref usando
sys.getrefcount(rai_XML): minimo otterrai 3 (il nome rai_XML, il
riferimento nella funzione sys.getrefcount e quello in sys.modules). Se ce
ne sono di piu' allora il modulo non lo cavi via.

Quello che vuoi fare non e' robusto perché un modulo non è esattamente un
oggetto normale, nel senso che non sai il sistema come lo usa. Se vuoi
davvero ripulire la memoria, cancella la struttura contenute dal modulo che
occupa 50MB, non il modulo stesso.

Un altro trucco per sapere se un oggetto viene davvero effettivamente
cancellato è quello di usare un weakref per vedere se qualcun altro lo
tiene ancora in vita.

-- 
Daniele Varrazzo - Develer S.r.l. 
http://www.develer.com


Maggiori informazioni sulla lista Python