Python Speicher Freigeben ...

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
KC25m
User
Beiträge: 65
Registriert: Freitag 14. Juli 2006, 12:11
Wohnort: Kassel
Kontaktdaten:

Montag 11. September 2006, 15:27

Hallo Leute , habe ein neues problem.
Arbeite gerade an einem KioskSystem was bis jetz auch super vorran geht.
Nur prob ist beim wechseln von seite zu seite wird immer neuer speicher belegt und erst bei einem anstoss am freien speicher geleert.

Kann man Python iregnd wie veranlassen das er alle X sekunden den speichern leeren soll ?
Oder besser noch direkt sagen kann guck mal ob du den speicher leeren kannst...

Weil würde mir sehr viel weiter helfen und ich bräuchte nicht immer gucken liegs nun am code oder halt doch am python.


Danke schon mal für die Antwort.

Gruß KC
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Montag 11. September 2006, 16:29

falls wirklich das das problem sein sollte, schau dir mal gc an und schau mal damit nach, was nicht entfernt werden kann.
denn normalerweise sollte python alles selber gut in der hand haben.
http://www.cs.unm.edu/~dlchao/flake/doom/
BlackJack

Montag 11. September 2006, 17:15

Es liegt bei CPython eigentlich immer an Deinem Programm. Erzeugst Du irgendwo zirkulär referenzierte Objekte? Das ist der einzige Fall bei dem der `gc` Garbage Collector zum Einsatz kommt.

Ansonsten verwaltet der Python-Interpretierer den Speicher nochmal selbst in grösseren Blöcken mit Algorithmen die auf das anlegen und löschen von vielen kleinen Objekten optimiert sind. Für jedes Objekt `malloc`/`free` aufzurufen ist nämlich ziemlich teuer.

Einmal belegter virtueller Speicher wird übrigens meistens nie wieder freigegeben im Sinne von "an das Betriebssystem zurückgeben". Das liegt aber nicht an Python, sondern an der verwendeten C Biblothek.
KC25m
User
Beiträge: 65
Registriert: Freitag 14. Juli 2006, 12:11
Wohnort: Kassel
Kontaktdaten:

Dienstag 12. September 2006, 09:24

Also gc sagt mir is nichts , collecte alles was geht und lösche hinterher...
Aber da ist nichts...
Cyclisch instanzen ja habe ich die lösche ich aber schon in eine schleife weil das war vorher das problem das der speicher total nicht frei gegeben würde.
Mein kleiner Kiosk hatte dann ruck zuck mal nen halben GB ran gefressen ...
Nun ist es so das der speicher steigt beim umschalten bis ca. 200MB und sich dann auf 50mb wieder runterstufft.
Was wiederum heist das die Widgets auch aus der liste raus gelöscht sind.
Ich benutze für das Via EPIA Pythin 2.4 , PyGAME 1.7.1 und PGu in der neusten version...
BlackJack

Mittwoch 13. September 2006, 12:34

In Python kannst Du keine Objekte direkt löschen. Du musst halt darauf achten, das Du keine Referenzen auf "grosse" Objekte behältst, wenn diese nicht mehr benötigt werden.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Mittwoch 13. September 2006, 12:53

Diesen Thread fand ich sehr interessant! Danke. Dann habe ich ein wenig hin und her gesucht und diese links gefunden:
http://evanjones.ca/python-memory.html
http://evanjones.ca/python-memory-part2.html (wesentlich kürzerer follow-up)
Danach sollte das "Problem" in Version 2.5 behoben sein, aber offizielle Aussagen dazu habe ich nicht finden können. (Weiß jemand von euch mehr?)
Jedenfalls werde ich mal ein wenig recherchieren, denn ich habe z. Zt. ein ähnliches Problem mit einer komplexen Klasse, zu deren Attributen auch numpy-arrays zählen, die rel. viel Speicher fressen. Löschen von Referenzen zu Instanzen dieser Klasse gibt nicht unbedingt Speicher frei - und das ist u. U. sehr ärgerlich. Bei Gelegenheit poste ich mal was ich dazu herausfinden werde.

Gruß,
Christian
KC25m
User
Beiträge: 65
Registriert: Freitag 14. Juli 2006, 12:11
Wohnort: Kassel
Kontaktdaten:

Donnerstag 14. September 2006, 13:25

Löschen aus dem speicher direkt geht nicht weiss ich ,
ich lösche aber alle referenzen zu dem Objekt überschreibe sie ...
Es geht ja auch nur was mích ärgert ist halt das ich immer erst bis zum wirklich knall vollen speicher warten muss bis Python mal dadran denkt oh da is ja was was ich freigeben kann ...
Bei mir is das eh mist weil 1GB Ram und 80GB hdd frei da gibts genug was geswapt werden kann in notfall ...
BlackJack

Donnerstag 14. September 2006, 15:01

Ich wäre mir da nicht so sicher, dass es Python ist. Das kann auch die C Laufzeitbibliothek oder das Betriebssystem sein, das dann erst anfängt die mit `free` freigegenen Blöcke auch wirklich wieder für andere Anwendungen verfügbar zu machen.

Letztendlich: Ist es denn ein Problem? "Freien" Speicher zu haben ist ja letztendlich unnötig, wenn nicht mehr Speicher benötigt wird als vorhanden ist.
KC25m
User
Beiträge: 65
Registriert: Freitag 14. Juli 2006, 12:11
Wohnort: Kassel
Kontaktdaten:

Montag 18. September 2006, 10:25

Das prob ist hier das wir viele grafiken im speicher haben als JPG/PNG die dadrauf warten wieder entpackt zu werden um das spiel weiter laufen zu lassen ... daher ist es wichtig das der speicher immer frei ist.
Nur anscheind ist es wirklich so das es nicht direkt am Py ligt.
Das System lädt die Grafiken imspeicher entpackt sie (hält eine kopie der datei fest) ruft das menue auf und beendet es nach eine weile wieder und der speicher ist normal bei kanppe 500MB ...
Davon gehen schon alleine kanppe 400MB für die Grafiken drauf ...

Also im Grossen ganzen ist alles gut gelaufen :)

Danke für Eure Antworten.

Gruß der KC
Antworten