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

Arbeitsspeicher wächst

Beitragvon Robin » Montag 24. September 2007, 08:29

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

Beitragvon BlackJack » Montag 24. September 2007, 09:32

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

Beitragvon Robin » Montag 24. September 2007, 11:20

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

Beitragvon BlackJack » Montag 24. September 2007, 12:46

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

Beitragvon Y0Gi » Montag 24. September 2007, 12:56

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

Beitragvon mitsuhiko » Montag 24. September 2007, 13:03

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

Beitragvon Robin » Montag 24. September 2007, 14:08

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

Beitragvon Robin » Montag 24. September 2007, 14:15

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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Montag 24. September 2007, 15:09

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

Beitragvon lunar » Montag 24. September 2007, 16:00

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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Montag 24. September 2007, 16:55

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

Hallo lunar!

Das schaffe ich mit Windows täglich. ;-)

[code=]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[/code]
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
lunar

Beitragvon lunar » Montag 24. September 2007, 17:12

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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Montag 24. September 2007, 17:34

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

Beitragvon Robin » Dienstag 25. September 2007, 07:38

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

Beitragvon BlackJack » Dienstag 25. September 2007, 08:17

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.

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot], Yahoo [Bot]