Nicht auslagerbarer Speicher wächst beständig

Fragen zu Tkinter.
Benutzeravatar
Robin
User
Beiträge: 50
Registriert: Dienstag 26. Juni 2007, 10:47

Hallo Pytho-Forum,

mit diesem Programm wächst der "Nicht auslagerbarer Speicher" beständig (0.1MB in 30 Sekunden).
Ist die Kombination Thread-Tkinter ungeeignet?
Welches Grafikmodul ist besser oder ist mein Rechner zu langsam?

Code: Alles auswählen

from Tkinter import *
import time
import thread

def go():
    thread.start_new_thread(endless,())

def endless():
    i = 0
    while 1:
        l.configure(text=str(i))
        time.sleep(.1)       
        i += 100

root = Tk()
l = Label(root)
l.pack()
go()
root.mainloop() 
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Man sollte nur vom Haupt-Thread auf die GUI zugreifen. Hierzu gibt es im Forum zahlreiche Artikel.
MfG
HWK
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Benutzeravatar
Robin
User
Beiträge: 50
Registriert: Dienstag 26. Juni 2007, 10:47

der link hilft mir nicht wirklich weiter ...
Zu dem Thema habe ich schon viele Programmiervorschläge erhalten,
doch bei allen Vorschlägen wächst der "Nicht auslagerbare" Speicher.
Entweder ist Python für permanente Grafikausgaben ungeeignet oder
mein Rechner zu schwach ...
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo Robin

Ich habe dein Code-Snippet ca 10min. laufen lassen. Bei mir wächst der Speicher nicht.

Mein Setup:
Linux SuSE 10.0
Python 2.5

Enthält die while-Schleife noch andere Anweisungen die du hier nicht aufgeführt hast?

Grüss wuf :wink:
Take it easy Mates!
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Unter OS/X wächst der Speicherbedarf langsam aber stetig wie beschrieben.

Stefan
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Gentoo Linux
Tk: 8.4.19-r1
Python: 2.6-r4

Bei mir wächst es auch nur marginal (2 Minuten -> +200Kbyte)
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Arch Linux
Python 2.6

Verhalten wie beschrieben, das Wachstum liegt, wie bei cofi, bei etwa 200kb/min


Ich gehe davon aus dass Tkinter da mist baut, generell würde ich eh zu gtk oder qt raten.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Suse 10.0 Python 2.5:

Speicherbedarf wächst in den ersten Minuten langsam an, bis auf 64 KB über dem Speicherbedarf beim Start. Danach findet keine Erhöhung mehr statt.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Windows XP, Python 2.4:
Speicher bleibt konstant.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

DasIch hat geschrieben:Ich gehe davon aus dass Tkinter da mist baut, generell würde ich eh zu gtk oder qt raten.
Wie kommst du zu der Annahme, dass Tkinter hier der Bösewicht ist?
Warum nicht dem Betriebssystem anlasten? Offenbar sind die Unterschiede im Speicherverbrauch auch vom Betriebssystem abhängig.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Kann mal jemand ausprobieren, ob das Problem auch noch besteht, wenn man Zeile 12

Code: Alles auswählen

l.configure(text=str(i))
durch

Code: Alles auswählen

root.after_idle(lambda: l.configure(text=str(i)))
ersetzt?
MfG
HWK
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Ändert bei mir nichts am Verhalten:
Innerhalb der ersten ca. 6 min ein Speichermehrverbrauch von insgesamt 64 KB, danach wird kein weiterer Speicher mehr gezogen (insgesamt 30 min laufen lassen).
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

@Robin: Wie ist es bei Dir?
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Den marginalen Speicherplatzmehrverbrauch von
Robin's Code kann ich auch bestätigen.
(Xubuntu 8.04, Python 2.5)

Bei meiner Version kann ich diesen nicht feststellen.
http://paste.pocoo.org/show/93018/

:wink:
yipyip
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

numerix hat geschrieben:Wie kommst du zu der Annahme, dass Tkinter hier der Bösewicht ist?
Warum nicht dem Betriebssystem anlasten?
$Betriebssystem ist sicherlich öfter und besser getestet als Tkinter. Desweiteren fällt Tkinter auch sonst so häufig positiv auf weswegen ja ein großteil aller Anwendungen Tkinter GUIs benutzen.
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

@HWK:
Hab's jetzt mit Deinem Vorschlag ca. 5 min laufen lassen,
auch hier vermindert sich die Grösse des freien Speichers
ähnlich wie schon vorher beobachtet.

:wink:
yipyip
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

DasIch hat geschrieben:Desweiteren fällt Tkinter auch sonst so häufig positiv auf weswegen ja ein großteil aller Anwendungen Tkinter GUIs benutzen.
Das ist unsachliche Ironie.

Es gibt ganz sicher gute Gründe, Tkinter nicht zu benutzen, vor allem, weil es hinsichtlich seiner Möglichkeiten hinter anderen einschlägigen GUI-Toolkits zurückbleibt und die Optik nicht ganz an das heranreicht, was man heutzutage als uptodate ansieht.

Aber Tkinter ist nicht grundsätzlich problematisch.
BlackJack

Wie sieht's denn aus, wenn ihr mal das `i` weglasst, da werden ja schliesslich ständig neue `int`-Objekte erzeugt. Und die werden vom Code der Speicher für Objekte verwaltet in "Gruppen" verwaltet, und so eine Gruppe wird erst wieder frei gegeben, wenn alle enthaltenen Objekte freigegeben wurden.

Wobei freigegeben auch nur bedeutet, dass das `free()` der C-Laufzeitbibliothek für den Speicherblock aufegrufen wird. Ob *die* dann wiederum den Speicher auch an das Betriebssystem zurück gibt, ist in keiner Weise garantiert. Und wenn sie das nicht tut, ist das vielleicht unangenehm, aber kein Fehler.

Ich denke auch nicht das man die Schuld da so vorschnell bei `Tkinter` suchen sollte. Oh, und Tk könnte auch schuld sein.

Was ich auch schon einmal hatte, war, dass der Speicherverbrauch bei einem Tkinterprogramm mit vielen Grafikveränderungen in kurzer Zeit auf ca. 10 MiB gewachsen ist, bevor er dann nahezu schlagartig wieder um 10 MiB zurück ging. Also vielleicht mal versuchen, ob manuelles Aufrufen des Garbage-Collectors einen sichtbaren Erfolg hat.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

DasIch hat geschrieben:$Betriebssystem ist sicherlich öfter und besser getestet als Tkinter.
Ironie hin oder her, aber das Argument gilt durchaus. Das Linux-Speichermodell ist nun mal schon Jahrelang auf extremste Weise erprobt, das wird bei Tkinter, Tk und Tcl weniger der Fall sein.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten