Seite 1 von 1

Variable mit None überscheiben

Verfasst: Montag 20. August 2012, 13:50
von Apotekarnes
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

Re: Variable mit None überscheiben

Verfasst: Montag 20. August 2012, 13:55
von webspider
Python nutzt Garbage Collection, d.h. sobald keine Referenz mehr auf besagtes Objekt vorhanden ist, wird es aus dem Speicher getilgt.

Re: Variable mit None überscheiben

Verfasst: Montag 20. August 2012, 14:03
von BlackJack
Wobei das keine Garantie ist, dass der Speicher auch irgendwem „zurück gegeben” wird.

Re: Variable mit None überscheiben

Verfasst: Montag 20. August 2012, 14:04
von snafu
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.

Re: Variable mit None überscheiben

Verfasst: Montag 20. August 2012, 14:05
von EyDu
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.

Re: Variable mit None überscheiben

Verfasst: Montag 20. August 2012, 14:11
von snafu
Vielleicht noch ein paar Hintergrundinfos zum Thema: Python Garbage Collection

Re: Variable mit None überscheiben

Verfasst: Montag 20. August 2012, 14:15
von 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.

Re: Variable mit None überscheiben

Verfasst: Montag 20. August 2012, 15:36
von Apotekarnes
@ 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

Re: Variable mit None überscheiben

Verfasst: Montag 20. August 2012, 16:02
von snafu
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. ;)

Re: Variable mit None überscheiben

Verfasst: Montag 20. August 2012, 16:36
von cofi
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.

Re: Variable mit None überscheiben

Verfasst: Montag 20. August 2012, 16:38
von 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.

Re: Variable mit None überscheiben

Verfasst: Montag 20. August 2012, 17:01
von BlackJack
Und falls die Datenmengen tatsächlich ein Problem darstellen sollten, wird es vielleicht Zeit über eine Datenbank nachzudenken. :-)

Re: Variable mit None überscheiben

Verfasst: Dienstag 21. August 2012, 15:45
von Leonidas
Oder eher noch: *wird* denn euer Rechner überfordert? Oder optimierst du nur, damit "die Zahl in top" kleiner ist?