No, já na o používám fintu:
def __del__ (self):
        print: 'je to smazany'

Takže vim, kdy to zmizlo

-----Original Message-----
From: [email protected] [mailto:[email protected]] On Behalf Of Petr 
Messner
Sent: Wednesday, July 08, 2009 4:19 PM
To: Konference PyCZ
Subject: Re: [python] sprava pameti,trida

2009/7/8 Petr Zlamal <[email protected]>:
> Pratele,
> Potreboval bych poradit jak uvolnit pamet v pythonu, respektive jak 
> odstranit nepotrebnou instanci tridy z pameti. Zkousel jsem prikaz 
> del. Po provedeni "del" na instanci tridy je vsak pamet zaplnena furt 
> stejne (sledovano pomoci top v linuxu). Mozna na to jdu uplne spatne. 
> Vi nekdo jak provest uvolneni?

Po použití del se jen "smaže" proměnná a tím odstraní reference na daný objekt. 
Objekt se uvolní až pokud na něj nejsou žádné reference (ihned nebo až si toho 
všimne garbage collector, záleží na implementaci a okolnostech). Ale dejme 
tomu, že se objekt skutečně smaže, protože jste zavolal del na jedinou 
referenci. Pak se paměť uvolní, jenže se jedná o paměť, kterou má python 
alokovanou právě pro objekty, tedy se uvolní místo třeba pro nový objekt; paměť 
není vrácena operačnímu systému (= žádná změna ve výpisu top), bylo by to 
neefektivní vždy vracet každý kousek uvolněné paměti a pak zase alokovat další 
(vlastně celý tenhle problém je o kompromisech mezi výkonem a zabranou pamětí, 
i volání malloc/free je dost drahé).

Pokud se ale takto nastřádá hodně nevyužité paměti, interpreter se může 
rozhodnout tuto paměť vrátit operačnímu systému. Ale záleží, jak bylo tato 
paměť od operačního systému získána (pokud je použita funkce malloc, záleží na 
implementaci v libc). Pokud se jedná o namapovanou paměť (mmap) a celý blok 
paměti (přinejmenším celá stránka) je nepotřebný, lze ho vrátit a hodnota v top 
se - konečně - sníží. Paměť lze od operačního systému získat i jinými způsoby, 
to bych zde ale už raději nerozváděl.

V důsledku toho se může stát, že při smazání velkého objektu se nemusí uvolnit 
tolik paměti, kolik ten objekt zabíral. Pokud si s tím chcete hrát, doporučuji 
strace :-)

To, co jsem teď napsal, je dost zjednodušené a zobecněné, napsal jsem to bez 
konkrétní znalosti vnitřností Pythonu, které se navíc s vývojem Pythonu a jeho 
interpreterů mění. Možná se pletu. V průběhu psaní této odpovědi Dan Pressl 
poslal odkaz na článek "Python Memory Management", tam je detailů více, třeba 
že pro různé typy objektů existují různé alokátory a některé z nich dokonce 
zabranou paměť nevrací.

Mimochodem, nedávno se na Python mailing-listu ozval někdo s dotazem, jestli 
nelze mít objekt naalokovaný řekněme dokud je volná paměť, že by pak třeba sám 
zmizel. Nelze :-) Lze ale použít třeba memcache.

PM
_______________________________________________
Python mailing list
[email protected]
http://www.py.cz/mailman/listinfo/python
 

__________ Informace od ESET NOD32 Antivirus, verze databaze 4224 (20090708) 
__________

Tuto zpravu proveril ESET NOD32 Antivirus.

http://www.eset.cz
 
 

__________ Informace od ESET NOD32 Antivirus, verze databaze 4227 (20090709) 
__________

Tuto zpravu proveril ESET NOD32 Antivirus.

http://www.eset.cz
 
_______________________________________________
Python mailing list
[email protected]
http://www.py.cz/mailman/listinfo/python

Odpovedet emailem