Seite 1 von 2

Nicht auslagerbarer Speicher wächst beständig

Verfasst: Freitag 28. November 2008, 15:27
von Robin
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() 

Verfasst: Freitag 28. November 2008, 15:34
von HWK
Man sollte nur vom Haupt-Thread auf die GUI zugreifen. Hierzu gibt es im Forum zahlreiche Artikel.
MfG
HWK

Verfasst: Freitag 28. November 2008, 15:38
von numerix

Verfasst: Freitag 28. November 2008, 16:05
von Robin
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 ...

Verfasst: Freitag 28. November 2008, 17:37
von wuf
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:

Verfasst: Samstag 29. November 2008, 11:57
von sma
Unter OS/X wächst der Speicherbedarf langsam aber stetig wie beschrieben.

Stefan

Verfasst: Samstag 29. November 2008, 12:29
von cofi
Gentoo Linux
Tk: 8.4.19-r1
Python: 2.6-r4

Bei mir wächst es auch nur marginal (2 Minuten -> +200Kbyte)

Verfasst: Samstag 29. November 2008, 12:35
von DasIch
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.

Verfasst: Samstag 29. November 2008, 12:53
von numerix
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.

Verfasst: Samstag 29. November 2008, 13:36
von HWK
Windows XP, Python 2.4:
Speicher bleibt konstant.

Verfasst: Samstag 29. November 2008, 13:56
von numerix
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.

Verfasst: Samstag 29. November 2008, 14:12
von HWK
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

Verfasst: Samstag 29. November 2008, 14:50
von numerix
Ä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).

Verfasst: Samstag 29. November 2008, 15:22
von HWK
@Robin: Wie ist es bei Dir?

Verfasst: Samstag 29. November 2008, 16:45
von yipyip
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

Verfasst: Samstag 29. November 2008, 17:03
von DasIch
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.

Verfasst: Samstag 29. November 2008, 17:07
von yipyip
@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

Verfasst: Samstag 29. November 2008, 17:16
von numerix
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.

Verfasst: Samstag 29. November 2008, 18:04
von 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.

Verfasst: Samstag 29. November 2008, 22:52
von Leonidas
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.