Portál AbcLinuxu, 4. května 2025 22:16

PyQt4 memory leak?

23.11.2008 13:21 | Přečteno: 1030× | Linux | poslední úprava: 23.11.2008 13:20

Nedávno som začal viac-menej z donútenia (škola) robiť nejaký program ako semestrálku v pythonovi. Konkrétne som si povedal, že urobím gui k boinc_client-ovi. Prekvapilo ma ale, že aplikácia zaberá stále viac RAM.

Takže po dlhom skúmaní som došiel k záveru, že problém je niekde okolo riadku s data = QVariant.fromList(...). Tak som urobil malý programík v pythonovi na ktorom by som si vyskúšal ako sa dá uvoľniť táto pamäť. Takže obsah toho malého programíku:

from PyQt4.QtCore import QVariant

while True:
	zoznam = QVariant.fromList([QVariant('text1'), QVariant('text2')])
	zoznam.clear()
	del(zoznam)

Predpokladám, že tento kód v pythonovi by mal byť ekvivalentný s nasledujúcim programom v C++:

#include <QVariant>
#include <QList>

int main(int argc, char *argv[])
{
	while (1)
	{
		QList<QVariant> zoznam;
		zoznam.append(QVariant("text1"));
		zoznam.append(QVariant("text2"));
		QVariant variant = QVariant(zoznam);
	}
}

Napriek tomu po spustení programu v pythonovi sa obsadená RAM stále zväčšuje zatiaľ čo v C++ nie. Robím niečo zle alebo je chyba skutočne niekde mimo môjho kódu? Robí to problémy aj ostatným užívateľom alebo len mne (napríklad preto, že PyQt4 zle skompiloval)?

Pre tých ktorí chcú vidieť čo to vlastne robím som prihodil aj screenshoty, prípadne môžete pozrieť video, zdrojové kódy nedám, hambím sa za ne.

       

Hodnocení: 100 %

        špatnédobré        

Obrázky

PyQt4 memory leak?, obrázek 1 PyQt4 memory leak?, obrázek 2

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (2) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

Luboš Doležel (Doli) avatar 23.11.2008 13:23 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: PyQt4 memory leak?
Odpovědět | Sbalit | Link | Blokovat | Admin
Jak má tohle fungovat?
QVariant variant = QVariant(zoznam);
Ten řádek je k ničemu...
mirec avatar 23.11.2008 13:28 mirec | skóre: 32 | blog: mirecove_dristy | Poprad
Rozbalit Rozbalit vše Re: PyQt4 memory leak?
Robí zhruba to isté čo v python zdrojovom kóde. Išlo mi len o to aby vytváralo QVariant objekt (aby som vyskúšal či nie je chyba v Qt4). Tie 2 zdrojové kódy nemajú žiaden hlbší zmysel, akurát jeden z nich na mojom stroji žerie nenormálne veľa RAM.
LinuxOS.sk | USE="-fotak -zbytocnosti -farebne_lcd +vydrz +odolnost +java" emerge telefon
Luboš Doležel (Doli) avatar 23.11.2008 13:44 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: PyQt4 memory leak?
Aha, už to chápu, nevšimnul jsem si toho listu v Pythonu.
andree avatar 23.11.2008 15:51 andree | skóre: 39 | blog: andreeeeelog
Rozbalit Rozbalit vše Re: PyQt4 memory leak?
Odpovědět | Sbalit | Link | Blokovat | Admin

noo, medzi tymi testami je viacero rozdielov... najzasadnejsi ale asi v tom, ze v c++ kode sa ti tie objekty naozaj uvolnia z RAM, kym v pythone je garbage collector.. skus tam este ked tak pridat import gc; gc.collect() za ten kod 'del'

mirec avatar 23.11.2008 16:12 mirec | skóre: 32 | blog: mirecove_dristy | Poprad
Rozbalit Rozbalit vše Re: PyQt4 memory leak?
No znížilo to spotrebu RAM na asi 50 kB/s. Neviem či to je spôsobené spomalením zamotného programu (teda volaním collect) alebo to uvoľňuje niečo navyše.
LinuxOS.sk | USE="-fotak -zbytocnosti -farebne_lcd +vydrz +odolnost +java" emerge telefon
mirec avatar 23.11.2008 18:04 mirec | skóre: 32 | blog: mirecove_dristy | Poprad
Rozbalit Rozbalit vše Re: PyQt4 memory leak?
Ok, takže som trochu skúmal či je to menej nenažrané. V skutočnosti to len extrémne spomalí beh (samozrejme hovorím o tom malom testovacom programe, pri obyčajnom gui to je samozrejme zanedbateľné).
LinuxOS.sk | USE="-fotak -zbytocnosti -farebne_lcd +vydrz +odolnost +java" emerge telefon
23.11.2008 20:55 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
Rozbalit Rozbalit vše Re: PyQt4 memory leak?
Odpovědět | Sbalit | Link | Blokovat | Admin
Zkus nastavit debugovací režim garbage collectoru gc.set_debug(gc.DEBUG_LEAK). V gc.garbage bys pak měl mít seznam objektů, které se nedají uvolnit.
When your hammer is C++, everything begins to look like a thumb.
mirec avatar 23.11.2008 21:42 mirec | skóre: 32 | blog: mirecove_dristy | Poprad
Rozbalit Rozbalit vše Re: PyQt4 memory leak?
To zvyknem vždy kontrolovať. Výstup po určitom počte iterácii (na asi 100MB) je [].
LinuxOS.sk | USE="-fotak -zbytocnosti -farebne_lcd +vydrz +odolnost +java" emerge telefon
24.11.2008 09:18 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
Rozbalit Rozbalit vše Re: PyQt4 memory leak?
Takže na openSUSE 11.1 mi to dělá to samé. Navíc volání gc.collect() program spíše jenom zpomalí, takže se zdá, že to něco řeší, ale vždy vrátí 0 uvolněných objektů. Co narůstá je počet objektů (gc.get_objects()), přičemž garbage collector se zdá pracuje, protože počet objektů v jednotlivých generací gc.get_count() roste, ale taky klesá.

Při nastaveném gc.DEBUG_STATS to naopak vypadá, že collector nepracuje, protože počet objektů roste. Ale ony si údaje gc.get_count() a to, co vypisuje gc samotný, moc neodpovídají.
gc: done.                                     
gc: collecting generation 0...                
gc: objects in each generation: 703 6300 58705
gc: done.                                     
gc: collecting generation 0...                
gc: objects in each generation: 703 7000 58705
gc: done.                                     
gc: collecting generation 1...                
gc: objects in each generation: 703 7700 58705
gc: done.                                     
gc: collecting generation 0...                
gc: objects in each generation: 703 0 67105  
Podle mě je to bug a mělo by to být oznámeno autorům PyQt4.
When your hammer is C++, everything begins to look like a thumb.
mirec avatar 23.11.2008 23:08 mirec | skóre: 32 | blog: mirecove_dristy | Poprad
Rozbalit Rozbalit vše Re: PyQt4 memory leak?
Odpovědět | Sbalit | Link | Blokovat | Admin
Ok, takže skúsme to uzavrieť. Prosím ak má niekto PyQt4 nech skúsi či to isté robí aj na inom stroji (teda hlavne na inej distribúcii). Predpokladám, že to asi nie je moja chyba, takže ak to robí aj niekomu inému nebolo by zlé nahlásiť bug.
LinuxOS.sk | USE="-fotak -zbytocnosti -farebne_lcd +vydrz +odolnost +java" emerge telefon
24.11.2008 00:07 helb
Rozbalit Rozbalit vše Re: PyQt4 memory leak?
Zkusil jsem a deje se mi to na notebooku (gentoo 32bit, python 2.6, PyQt4 4.4.4) i desktopu (gentoo 64it, python 2.5, PyQt4 4.4.3).

Založit nové vláknoNahoru

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.