Variable mit None überscheiben

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
Apotekarnes
User
Beiträge: 18
Registriert: Mittwoch 21. September 2011, 10:02

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
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Python nutzt Garbage Collection, d.h. sobald keine Referenz mehr auf besagtes Objekt vorhanden ist, wird es aus dem Speicher getilgt.
BlackJack

Wobei das keine Garantie ist, dass der Speicher auch irgendwem „zurück gegeben” wird.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Variablen löschen geht mit `del`. Wenn also die Variable `x` heißt:

Code: Alles auswählen

del x
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.
Zuletzt geändert von snafu am Montag 20. August 2012, 14:07, insgesamt 1-mal geändert.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
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.
Das Leben ist wie ein Tennisball.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Vielleicht noch ein paar Hintergrundinfos zum Thema: Python Garbage Collection
BlackJack

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.
Apotekarnes
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:
Python nutzt Garbage Collection, d.h. sobald keine Referenz mehr auf besagtes Objekt vorhanden ist, wird es aus dem Speicher getilgt.
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?

Naja, vielen Dank, Leute! Ich werde es einfach in Funktionen abhandeln.

Grüße,
Apotekarnes
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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. ;)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Apotekarnes hat geschrieben:@ webspider:
Python nutzt Garbage Collection, d.h. sobald keine Referenz mehr auf besagtes Objekt vorhanden ist, wird es aus dem Speicher getilgt.
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?
Schau dir mal das gc Modul an: http://docs.python.org/library/gc.html
`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.
deets

@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.
BlackJack

Und falls die Datenmengen tatsächlich ein Problem darstellen sollten, wird es vielleicht Zeit über eine Datenbank nachzudenken. :-)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Oder eher noch: *wird* denn euer Rechner überfordert? Oder optimierst du nur, damit "die Zahl in top" kleiner ist?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten