Hallo allerseits!
In meinem Programm werden Variablen (Dictionaries) mit Speicher-Größen von 20 GB erstellt. Damit unser Großrechner nicht überlastet wird, setze ich die Variablen, auf None, sobald sie im weiteren Programmablauf nicht mehr benötigt werden.
Leider habe ich das Gefühl, dass dadurch der Speicherplatz im RAM nicht abnimmt. Täusche ich mich da? Was muss / kann man tun, um bestimmte Variablen zu löschen/überschreiben.
Viele Grüße,
Apotekarnes
Variable mit None überscheiben
Wobei das keine Garantie ist, dass der Speicher auch irgendwem „zurück gegeben” wird.
Variablen löschen geht mit `del`. Wenn also die Variable `x` heißt:
Es ist jedoch nicht garantiert, dass der Garbage Collector das `x` dann auch unmittelbar abräumt. Da kann man eventuell mit gc.collect() nachhelfen. Habe ich offen gestanden aber noch nie verwendet und weiß daher nicht, ob das wirklich eine gute Idee ist.
//edit: Genau genommen wird natürlich nur die *Referenz* auf den Wert hinter `x` gelöscht. Erst wenn keine Referenzen mehr bestehen, gilt ein Objekt als "abräumreif". Also auch da genau aufpassen.
Code: Alles auswählen
del x
//edit: Genau genommen wird natürlich nur die *Referenz* auf den Wert hinter `x` gelöscht. Erst wenn keine Referenzen mehr bestehen, gilt ein Objekt als "abräumreif". Also auch da genau aufpassen.
Zuletzt geändert von snafu am Montag 20. August 2012, 14:07, insgesamt 1-mal geändert.
Um es mal mit deinen Worten zu sagen: wie hast du denn gefühlt das kein Speicher freigegeben wurde und was hast du dabei gefühlt? Aber mal im ernst, ohne konkrete Messungen und Messverfahren ist deine Fragestellung etwa sehr schwammig.Apotekarnes hat geschrieben:Leider habe ich das Gefühl, dass dadurch der Speicherplatz im RAM nicht abnimmt. Täusche ich mich da? Was muss / kann man tun, um bestimmte Variablen zu löschen/überschreiben.
Das Leben ist wie ein Tennisball.
Vielleicht noch ein paar Hintergrundinfos zum Thema: Python Garbage Collection
Weder auf `None` setzen noch einen Namen löschen sollte übrigens nötig sei wenn das Programm ordentlich in Funktionen strukturiert ist. Denn dann existieren lokale Daten sowieso nur so lange wie sie auch benötigt werden.
-
- User
- Beiträge: 18
- Registriert: Mittwoch 21. September 2011, 10:02
@ Black Jack: Ja, das ist richtig und mir bewusst. Ich frage das eher aus Neugierde.
@ Ey Du: Ok, ich sehe vor wie auch nach der Löschung bzw. Überschreibung mit None immer noch einen RAM-Verbrauch von 20 GB, als hätte das keinerlei Effekt gehabt. Vor der Erzeugung der Variable ist der RAM zu 1 GB ausgelastet.
@ webspider:
Naja, vielen Dank, Leute! Ich werde es einfach in Funktionen abhandeln.
Grüße,
Apotekarnes
@ Ey Du: Ok, ich sehe vor wie auch nach der Löschung bzw. Überschreibung mit None immer noch einen RAM-Verbrauch von 20 GB, als hätte das keinerlei Effekt gehabt. Vor der Erzeugung der Variable ist der RAM zu 1 GB ausgelastet.
@ webspider:
Ok, wenn das Objekt innerhalb einer Funktion war, die fertig durchgelaufen ist, dann gibt es keine Referenz mehr darauf. Handelt es sich jedoch um eine globale Variable außerhalb von Funktionen (quick&dirty bioinformatisches Skript) und ich setze variable = None, sollte das nicht auch helfen?Python nutzt Garbage Collection, d.h. sobald keine Referenz mehr auf besagtes Objekt vorhanden ist, wird es aus dem Speicher getilgt.
Naja, vielen Dank, Leute! Ich werde es einfach in Funktionen abhandeln.
Grüße,
Apotekarnes
Wie schon von mir zuvor angedeutet: Wenn an anderer Stelle auf den Wert hinter der Variablen zugegriffen wird - also sehr wahrscheinlich durch Verweis auf den Namen, etwa: `y = x` -, dann kommt es zu keiner Löschung des Objekts. Stell dir das wie bei Internet-Seiten vor: Eine Seite wird erst dann gelöscht, wenn von nirgendwo aus mehr auf die Seite verlinkt wird. Es hilft bei mehreren Links nichts, wenn nur ein Link gelöscht wird (oder wenn der Link einfach auf etwas anderes verweist), sondern es muss *jeder* Link gelöscht sein. Ich sage nicht, dass das Problem bei dir auftreten wird - ich meine nur, dass du bei sowas gut aufpassen musst bzw will ich mögliche Überraschungen vorwegnehmen.
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Schau dir mal das gc Modul an: http://docs.python.org/library/gc.htmlApotekarnes hat geschrieben:@ webspider:Ok, wenn das Objekt innerhalb einer Funktion war, die fertig durchgelaufen ist, dann gibt es keine Referenz mehr darauf. Handelt es sich jedoch um eine globale Variable außerhalb von Funktionen (quick&dirty bioinformatisches Skript) und ich setze variable = None, sollte das nicht auch helfen?Python nutzt Garbage Collection, d.h. sobald keine Referenz mehr auf besagtes Objekt vorhanden ist, wird es aus dem Speicher getilgt.
`gc.get_referrers` im besonderen koennte dir da helfen. Wichtig ist, dass du dir das Objekt anschaust, dass du "ueberschreiben" wuerdest, um zu schauen ob es die einzige Referenz ist und damit geloescht werden wuerde.
Mit local/global hat das ganze aber nicht unbedingt zu tun.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
@Apotekarnes
Du unterliegst einem Trugschluss wenn du denkst, dass man es einem Prozess ansehen *muss*, dass er Speicher freigibt. Das kann so sein, aber genau so gut kann das Betriebssystem entscheiden, die angeforderten Pages dem Prozess einfach weiterhin zur Verfuegung zu stellen.
Das soll heiss: ein Prozess wird nur "dicker", nie duenner. Was natuerlich nicht heisst, dass die Freigabe von Objekten durch Python nicht dazu fuehrt, dass innerhalb des Prozessraumes wieder Speicher freigegeben wird und neu angefordert werden kann.
Wenn also dein Skript mehrfach mit 20GB Daten laeuft, aber dabei nicht neu gestartet wird und auch nicht jedesmal 20GB draufpackt - dann bist du schon da, wo du sein willst.
Du unterliegst einem Trugschluss wenn du denkst, dass man es einem Prozess ansehen *muss*, dass er Speicher freigibt. Das kann so sein, aber genau so gut kann das Betriebssystem entscheiden, die angeforderten Pages dem Prozess einfach weiterhin zur Verfuegung zu stellen.
Das soll heiss: ein Prozess wird nur "dicker", nie duenner. Was natuerlich nicht heisst, dass die Freigabe von Objekten durch Python nicht dazu fuehrt, dass innerhalb des Prozessraumes wieder Speicher freigegeben wird und neu angefordert werden kann.
Wenn also dein Skript mehrfach mit 20GB Daten laeuft, aber dabei nicht neu gestartet wird und auch nicht jedesmal 20GB draufpackt - dann bist du schon da, wo du sein willst.
Und falls die Datenmengen tatsächlich ein Problem darstellen sollten, wird es vielleicht Zeit über eine Datenbank nachzudenken.