Arbeitsspeicher wächst

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Robin
User
Beiträge: 50
Registriert: Dienstag 26. Juni 2007, 10:47

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?
Zuletzt geändert von Robin am Montag 24. September 2007, 09:47, insgesamt 1-mal geändert.
BlackJack

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.
Benutzeravatar
Robin
User
Beiträge: 50
Registriert: Dienstag 26. Juni 2007, 10:47

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()
BlackJack

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.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Mensch, ich hätte gerne Arbeitsspeicher, der selbstständig wächst... *scnr* ;)
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Y0Gi hat geschrieben:Mensch, ich hätte gerne Arbeitsspeicher, der selbstständig wächst... *scnr* ;)
Mozilla hätte das auch gerne.
TUFKAB – the user formerly known as blackbird
Benutzeravatar
Robin
User
Beiträge: 50
Registriert: Dienstag 26. Juni 2007, 10:47

na der verbrauchte Arbeitsspeicher ... :-)
Benutzeravatar
Robin
User
Beiträge: 50
Registriert: Dienstag 26. Juni 2007, 10:47

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
Benutzeravatar
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)``:

Code: Alles auswählen

labvar = tk.Variable(...)
l = Label(textvariable = labvar)
...
labvar.set("asdf")
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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
lunar

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...
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

lunar hat geschrieben:840 MB? Sag mal, was hast du den alles am Laufen?
Hallo lunar!

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
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
lunar

Windows :roll:

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.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

lunar hat geschrieben:Windows :roll:
Hallo lunar!

Dualboot mit Ubuntu. ;-)

Aber zum Arbeiten bleibt mir nichts anderes übrig. :cry: 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.
Benutzeravatar
Robin
User
Beiträge: 50
Registriert: Dienstag 26. Juni 2007, 10:47

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
BlackJack

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.
Benutzeravatar
Robin
User
Beiträge: 50
Registriert: Dienstag 26. Juni 2007, 10:47

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

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()
BlackJack

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.
Benutzeravatar
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
Antworten