[Python] Garbage collection
Pietro Battiston
toobaz a email.it
Mar 30 Mar 2010 15:42:34 CEST
Il giorno mar, 30/03/2010 alle 13.04 +0200, Daniele Varrazzo ha
scritto:
> 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.
... e infatti sono 4... ma non c'è un metodo per sapere da quali oggetti
vengono i riferimenti?
> 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.
Ho provato, ma senza successo... la struttura che penso sia colpevole
("xmldoc", nel codice) ha effettivamente 93105 referenze... ma non ho
idea di chi siano i colpevoli (ho provato a fare "del" di tutto...).
>
> 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.
>
Anche lì però non c'è modo di sapere _quale altro_ lo tiene in vita?
Per ora ho "risolto" facendo semplicemente un os.fork...
Pietro
Maggiori informazioni sulla lista
Python