[python] sprava pameti,trida

MICHÁLEK Jan Mgr. Michalek.Jan na uhul.cz
Čtvrtek Červenec 9 10:28:52 CEST 2009


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

Takže vim, kdy to zmizlo

-----Original Message-----
From: python-bounces na py.cz [mailto:python-bounces na py.cz] 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 <p.zlamal na gmail.com>:
> 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
Python na py.cz
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
 


Další informace o konferenci Python