Hallo Python-Forum,
in meinem Programm wächst der Arbeitsspeicher ständig.
Prinzipieller Programmabaluf
THREAD
WHILE TRUE
# ENDLOSSCHLEIFE
# for i in range(128)
# Einträge in GRID
MAIN
# GRAFISCHE ELEMENTE definieren, GRID
Aufruf THREAD
MAINLOOP
Ziel des Programms ist es 128 Gerätze abzufragen und
sie permanent in einem Grid darzusellen.
Das funktioniert auch, nur wächst mein Arbeitsspeicher ständig.
Wer kann mir weiterhelfen?
Arbeitsspeicher wächst
Niemand kann Dir bei so dürftigen Informationen helfen.
Das einzige was man aus dieser Beschreibung sagen kann ist, dass Du irgendwo Objekte sammelst, die Du wahrscheinlich nicht mehr brauchst und das es, fast egal welches GUI Toolkit Du benutzt, keine gute Idee ist von einem anderen Thread aus, als dem in dem die Hauptschleife der GUI läuft, auf die GUI zuzugreifen.
Das einzige was man aus dieser Beschreibung sagen kann ist, dass Du irgendwo Objekte sammelst, die Du wahrscheinlich nicht mehr brauchst und das es, fast egal welches GUI Toolkit Du benutzt, keine gute Idee ist von einem anderen Thread aus, als dem in dem die Hauptschleife der GUI läuft, auf die GUI zuzugreifen.
Hier wäre ein Beispielprogramm, dann wächst der Arbeitsspeicher beständig
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=i)
i += 100
def print_it():
print "hello"
root = Tk()
l = Label()
l.pack()
go()
root.mainloop()
Das kann ich nicht nachvollziehen, was aber nichts heissen will, weil Du von einem anderen Thread auf die GUI zugreifst. Wie gesagt: das darf man nicht. Da können die "lustigsten" Dinge passieren.
-
- User
- Beiträge: 1790
- Registriert: Donnerstag 28. Oktober 2004, 16:33
- Wohnort: Graz, Steiermark - Österreich
- Kontaktdaten:
Mozilla hätte das auch gerne.Y0Gi hat geschrieben:Mensch, ich hätte gerne Arbeitsspeicher, der selbstständig wächst... *scnr*
TUFKAB – the user formerly known as blackbird
Das obige Beispiel habe ich übrigends aus dem Python-Forum als Grundlage genommen und es wurde als tauglich erklärt. Wie kann ich denn sonst z.B. ein Grid auf einem GUI permanent zyklisch darstellen, in dem Forumbeitrag wurde ausdrücklich auf Threads verwiesen.
Siehe http://www.python-forum.de/topic-2770.h ... d+schleife
zweiter Beitrag
Siehe http://www.python-forum.de/topic-2770.h ... d+schleife
zweiter Beitrag
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hallo Robin!
Ich habe schon lange nichts mehr mit Tkinter gemacht, aber ich glaube, die Threadtrennung erreichst du bei Tkinter mit der Verwendung von "textvariable".
Also statt ``l.configure(text = i)``:
Ansonsten würde ich erst Alarm schlagen, wenn dein Programm oder Computer bei einem lang anhaltenden Test abstürzt. Es ist ganz normal, dass Programme mit der Zeit immer mehr Speicher anfordern wenn eine Schleife unter Vollast läuft. Der GC gibt aber, sobald er Zeit hat, den meisten Speicher wieder frei.
EDIT:
Zu deinem Beispiel: Es läuft bei mir schon seit fünf Minuten und mein Speicherverbrauch bleibt konstant auf 841 MB.
EDIT2:
Der Speicherverbrauch ist jetzt auf 837 MB gesunken.
mfg
Gerold
Ich habe schon lange nichts mehr mit Tkinter gemacht, aber ich glaube, die Threadtrennung erreichst du bei Tkinter mit der Verwendung von "textvariable".
Also statt ``l.configure(text = i)``:
Code: Alles auswählen
labvar = tk.Variable(...)
l = Label(textvariable = labvar)
...
labvar.set("asdf")
EDIT:
Zu deinem Beispiel: Es läuft bei mir schon seit fünf Minuten und mein Speicherverbrauch bleibt konstant auf 841 MB.
EDIT2:
Der Speicherverbrauch ist jetzt auf 837 MB gesunken.
mfg
Gerold
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
840 MB? Sag mal, was hast du den alles am Laufen? Selbst mit KDE, Firefox, Amarok, KMail und Emacs komme ich nicht über 400 hinaus...
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hallo lunar!lunar hat geschrieben:840 MB? Sag mal, was hast du den alles am Laufen?
Das schaffe ich mit Windows täglich.
Code: Alles auswählen
J:\Dokumente und Einstellungen\Gerold>tasklist | C:\cygwin\bin\sort.exe -rk5
Abbildname PID Sitzungsname Sitz.-Nr. Speichernutzung
========================= ===== ================ ========== ===============
sqlservr.exe 304 Console 0 180.156 K
devenv.exe 5860 Console 0 49.340 K
Skype.exe 2352 Console 0 41.844 K
firefox.exe 5152 Console 0 41.104 K
thunderbird.exe 344 Console 0 35.224 K
TSVNCache.exe 492 Console 0 29.372 K
svchost.exe 1836 Console 0 29.324 K
RTHDCPL.exe 388 Console 0 22.344 K
explorer.exe 840 Console 0 21.036 K
ClamTray.exe 1756 Console 0 18.116 K
soffice.bin 2824 Console 0 16.416 K
skypePM.exe 4084 Console 0 15.216 K
winamp.exe 2200 Console 0 14.072 K
LaunchApplication.exe 2072 Console 0 13.112 K
services.exe 1172 Console 0 11.740 K
ServiceLayer.exe 3948 Console 0 8.152 K
dllhost.exe 4580 Console 0 7.916 K
spoolsv.exe 708 Console 0 7.552 K
GhostTyp.exe 2736 Console 0 7.276 K
ipoint.exe 1740 Console 0 6.972 K
TosBtMng.exe 2800 Console 0 6.684 K
winlogon.exe 1128 Console 0 6.292 K
wmiprvse.exe 1888 Console 0 5.952 K
TosOBEX.exe 2368 Console 0 5.880 K
wing.exe 2404 Console 0 5.528 K
svchost.exe 1348 Console 0 5.320 K
msdtc.exe 4732 Console 0 4.984 K
jusched.exe 1980 Console 0 4.928 K
svchost.exe 400 Console 0 4.832 K
sqlmangr.exe 2784 Console 0 4.820 K
svchost.exe 1064 Console 0 4.688 K
svchost.exe 1412 Console 0 4.684 K
tasklist.exe 2620 Console 0 4.428 K
TosBtHSP.exe 3508 Console 0 4.324 K
ctfmon.exe 2080 Console 0 4.248 K
TosA2dp.exe 3328 Console 0 3.736 K
csrss.exe 1096 Console 0 3.716 K
TosBtProc.exe 3220 Console 0 3.664 K
sshd.exe 1532 Console 0 3.656 K
daemon.exe 2140 Console 0 3.612 K
mdm.exe 2844 Console 0 3.576 K
alg.exe 2272 Console 0 3.504 K
svchost.exe 1876 Console 0 3.468 K
vmware-authd.exe 1704 Console 0 3.400 K
rundll32.exe 1736 Console 0 3.276 K
svchost.exe 1956 Console 0 3.244 K
svchost.exe 1952 Console 0 3.160 K
cmd.exe 3232 Console 0 2.836 K
scardsvr.exe 808 Console 0 2.528 K
sched.exe 1820 Console 0 2.524 K
TosBtSrv.exe 1656 Console 0 2.456 K
cygrunsrv.exe 1564 Console 0 2.296 K
IAAnotif.exe 1984 Console 0 2.116 K
sort.exe 3620 Console 0 2.096 K
vmnat.exe 2124 Console 0 1.936 K
soffice.exe 2788 Console 0 1.928 K
BRSS01A.EXE 724 Console 0 1.828 K
taskmgr.exe 2808 Console 0 1.776 K
lsass.exe 1184 Console 0 1.672 K
TosBtHid.exe 3488 Console 0 1.548 K
vmnetdhcp.exe 2232 Console 0 1.524 K
IAANTMon.exe 2036 Console 0 1.380 K
BRSVC01A.EXE 692 Console 0 1.172 K
avgnt.exe 3572 Console 0 800 K
smss.exe 872 Console 0 404 K
avguard.exe 3744 Console 0 380 K
System 4 Console 0 220 K
realsched.exe 1460 Console 0 184 K
System Idle Process 0 Console 0 16 K
Gerold
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Windows
Allerdings läuft bei dir auch mehr. VmWare, OpenOffice und ein Sql Server sind wahrscheinlich ordentliche Speicherfresser. Glücklicherweise kann ich dank sqlite und KOffice auf die beiden letzteren verzichten. Nur VmWare muss leider sein, VirtualBox weigert sich beharrlich, seinen Dienst zu tun. Allerdings läuft vmware auch nur dann, wenn es wirklich benötigt wird.
Allerdings läuft bei dir auch mehr. VmWare, OpenOffice und ein Sql Server sind wahrscheinlich ordentliche Speicherfresser. Glücklicherweise kann ich dank sqlite und KOffice auf die beiden letzteren verzichten. Nur VmWare muss leider sein, VirtualBox weigert sich beharrlich, seinen Dienst zu tun. Allerdings läuft vmware auch nur dann, wenn es wirklich benötigt wird.
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hallo lunar!lunar hat geschrieben:Windows
Dualboot mit Ubuntu.
Aber zum Arbeiten bleibt mir nichts anderes übrig. Der MS-SQLServer und das Visual Studio läuft noch nicht unter Linux. Auch nicht im WINE.
mfg
Gerold
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Hallo Gerold,
danke für den Tipp. Das I.configure verwende ich gar nicht. Bei mir wird ein großes Grid in der Zeit immer wieder beschrieben (128 Gridpositionen). In Visual Basic gibt es den Befehl DoEvents, da kann der Rechner auch parallel arbeiten. Ich habe meines Wissens auch keine Variablen, die immer größer werden. Wenn ich mehr Pausen (sleep) einbaue bzw. die Bildschirmausgaben reduziere, wird es besser. Ich mache mal einen Langzeittest.
Gruß Robin
danke für den Tipp. Das I.configure verwende ich gar nicht. Bei mir wird ein großes Grid in der Zeit immer wieder beschrieben (128 Gridpositionen). In Visual Basic gibt es den Befehl DoEvents, da kann der Rechner auch parallel arbeiten. Ich habe meines Wissens auch keine Variablen, die immer größer werden. Wenn ich mehr Pausen (sleep) einbaue bzw. die Bildschirmausgaben reduziere, wird es besser. Ich mache mal einen Langzeittest.
Gruß Robin
Wenn Du kein `configure()` benutzt, erzeugst Du doch am Ende nicht ständig 128 neue Widgets und wunderst Dich über Speicherverbrauch, oder?
Eine eigene Event-Schleife kannst Du Dir für Tkinter natürlich auch bauen. Da ist die `update()`-Methode wahrscheinlich das Pendant zu `DoEvents`. Oder Du hängst eine eigene Funktion über die `after_idle()`-Methode in die vorhandene Hauptschleife ein.
Eine eigene Event-Schleife kannst Du Dir für Tkinter natürlich auch bauen. Da ist die `update()`-Methode wahrscheinlich das Pendant zu `DoEvents`. Oder Du hängst eine eigene Funktion über die `after_idle()`-Methode in die vorhandene Hauptschleife ein.
Hallo BlackJack
In diesem Beispiel kann man sehen, dass der benötigte Arbeitsspeicher ständig anwächst.
Die after_idle() Methode sagt mir nichts. Die Widgets muß ich doch zwischen root=tk.TK()
und mainloop() defininieren. Root.update() bringt hier nichts oder wie meintest Du das?
Gruß Robin
In diesem Beispiel kann man sehen, dass der benötigte Arbeitsspeicher ständig anwächst.
Die after_idle() Methode sagt mir nichts. Die Widgets muß ich doch zwischen root=tk.TK()
und mainloop() defininieren. Root.update() bringt hier nichts oder wie meintest Du das?
Gruß Robin
Code: Alles auswählen
import Tkinter as tk
import time
import thread
def counter():
i = 1
while 1:
countvar.set(str(i))
i += 1
root.update()
root = tk.Tk()
countvar = tk.StringVar()
label = tk.Label(root, textvariable = countvar, font = ("Comic Sans MS", 20))
label.pack()
thread.start_new_thread(counter, ())
root.mainloop()
Also das belegt bei mir auch konstant viel Speicher. Da wächst nix, ausser der angezeigten Zahl natürlich.
Das `update()` ist hier natürlich überflüssig weil Du eine `mainloop()` laufen hast.
Das `update()` ist hier natürlich überflüssig weil Du eine `mainloop()` laufen hast.
- Rebecca
- User
- Beiträge: 1662
- Registriert: Freitag 3. Februar 2006, 12:28
- Wohnort: DN, Heimat: HB
- Kontaktdaten:
Bei mir waechst es schon, wenn auch langsam. Erst habe ich gedacht, das liegt vielleicht an dem groesser werdenden Integer/Long, aber wenn ich das i +=1 auskommentiere, aendert sich das Verhalten nicht. Hatte das auch bei den vorher geposteten Versionen.
Offizielles Python-Tutorial (Deutsche Version)
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei