2013-05-03 27 views
6

Używam najnowszej wersji instalatora Py-TK All-in-One (2.24.2) dla Pythona 2.7, który obejmuje Kair 1.10.8, Pango 1.29.4 , PyGTK 2.24.0 i PyGobject 2.28.3 (myślę).Praca nad dużym wyciekiem pamięci w GTK przy odświeżaniu etykiety

Poniższe przecieki kod ~ 55 MB pamięci:

import gtk 

window = gtk.Window() 
label = gtk.Label() 
window.add(label) 
window.show_all() 
for _ in range(100000): 
    label.set_markup('Leaking memory!') 
    while gtk.events_pending(): 
     gtk.main_iteration() 

Uwaga: dla pętli w moim skrypcie testowym tylko tak mogłem zobaczyć wzrost zużycia pamięci w Menedżerze zadań. Zasadniczo chodzi o to, co dzieje się w mojej prawdziwej aplikacji, z wyjątkiem tego, że tekst etykiety zmienia się co najmniej raz na sekundę, a nie tylko jest przerysowywany z tym samym tekstem za każdym razem.

Linia problemu to label.set_markup(), która przecieka około 0,5kB na połączenie, więc podejrzewam, że problem jest gdzieś w GTK lub Kairu. Jest to prawdopodobnie this bug (685959), jak zauważył komentator.

Próbowałem użyć funkcji objgraph, aby zobaczyć, czy jakieś dodatkowe obiekty Pythona wyświetlają się proporcjonalnie do liczby wywołań do gtk.Label.set_markup(), ale nie ma nadmiarowych obiektów. Wynika z tego, że połączenia z gc.collect() nie pomagają, a ja starałem się to upewnić. Python nie wydaje się być świadomy obiektów, które są odpowiedzialne za zużycie pamięci.

Jak znaleźć ten wyciek pamięci i/lub obejść go? Potrzebuję używać znaczników do stylu tekstu dla tej aplikacji, ale próbowałem użyć gtk.Label.set_text() jako obejścia problemu i również wyciekam z pamięci.

Należy zauważyć, że ta aplikacja jest przeznaczona dla systemu Windows, więc użycie PyGObject do pobrania GTK 3 nie jest możliwe - introspekcja GObject to nadal niedostępne w systemie Windows.

+0

Czy to wcięcie poprawny? Używasz gtk.main_iteration() tak długo, jak istnieją zdarzenia po każdym ustawieniu etykiety? – pcurry

+0

Tak, to jest właściwy sposób, aby to zrobić. To w zasadzie zamienia pętlę główną na drugą. –

+0

@ Series8217 Do czego służy pętla for? – jadkik94

Odpowiedz

1

Bug (685959) to rzeczywiście problem. Błąd jest naprawiony w gtk + 2.24.14. Jednak 2.24.14 nie będzie kompilował dla win32 (mam nadzieję, że każdy czytający moje pytanie i odpowiedź uświadomi sobie w tym momencie, że GTK nie jest już rozsądnym wyborem lub rozwojem międzyplatformowym).

Zastosowałem this patch do 2.24.10 i pomyślnie skompilowałem wynik. Z moimi nowymi plikami runtime wygląda na to, że działa.

Kiedyś z instrukcjami tutaj, aby zbudować GTK na Windows z MinGW: http://ingar.satgnu.net/devenv/mingw32/gtk.html

32-bitowy build zawiedzie wokół gtk-update-icon-cache chyba uruchomieniu się Msys powłoki jako administrator. W przypadku wersji 64-bitowej przed uruchomieniem make należy wykonać polecenie rm gtk/gtk.def. Zbudować i zainstalować gtk + wykonując następujące polecenia:

cd $ LOCALBUILDDIR & & \ wget -c http://ftp.gnome.org/pub/gnome/sources/gtk+/2.24/gtk+-2.24.10.tar.xz & & \ xz -d -c GTK + -2.24.10.tar.xz | tar xv & & \ cd gtk + -2.24.10 & & \ ./ Skonfigurować prefix = $ LOCALDESTDIR --with-gdktarget = win32 \ --with-zawarte-modułów metod = ime --disable-debug --disable-gtk-doc & & \ dokonać & & \ make install

wiem, że to nie jest „obejście” jak poprosiłem o moim pytaniu, ale ponad 6 miesięcy bez odpowiedzi mówi mi, nie ma obejście wyjątkiem poprawiania błędów w czasie wykonywania ...