Seite 1 von 1

Wie kontrolliere ich, wieviel ich schon im Hauptspeicher hab

Verfasst: Dienstag 6. August 2002, 18:51
von steffi
Hallo!

Ich will externes Sortieren implementieren und denke daran, das in Python zu tun.

In meinem Algorithmus lese ich erst Elemente ein, bis eine gewisse Speicherkapazitaet gefuellt ist.

Nun meine Frage: Wie stelle ich in Python fest, ob ich diese Kapazitaet erreicht oder gar ueberschritten habe?

Soweit ich rausfinden konnte, werden Objekte von Python ja automatisch entfernt, sobald sie nicht mehr referenziert werden. Kann ich das irgendwie kontrollieren oder beeinflussen?

Denn im naechsten Schritt schreibe ich den Inhalt des Hauptspeichers auf die Platte, und lese dann erneut ein. Was, wenn Python meine alten Elemente aus dem ersten Lauf noch im Hauptspeicher haelt, und mir der Platz fuer die neu eingelesenen Objekte fehlt?

Macht es in diesem Fall ueberhaupt Sinn, Python zu verwenden?

Steffi

Verfasst: Mittwoch 7. August 2002, 08:18
von loewis
Python gibt Objekte sofort frei, wenn sie nicht mehr referenziert werden. Dazu ist nichts weiter zu tun als tatsächlich die Referenzen freizugeben. Wenn Du also eine Liste X mit Werten hast, musst Du

X = None

oder ausführen, um diese Liste freizugeben. Die wird dann allerdings nur freigegeben, wenn es keine weiteren Referenzen gibt.

U.U. ensteht "zyklischer Garbage", also Objekte, die sich gegenseitig referenzieren, ohne von aussen erreichbar zu sein. Sowas sollte man vermeiden.

Wenn es doch auftritt, wird in regelmäßigen Abständen der Garbage Collector diese Objekte freigeben. Das kann man mit gc.collect() explizit auslösen.

Die Menge an verbrauchtem Hauptspeicher kann man in Python nicht programmatisch ermitteln.

Re: Wie kontrolliere ich, wieviel ich schon im Hauptspeicher

Verfasst: Freitag 9. August 2002, 17:26
von mrlee
du kannst mit:

del daten

Die Bindung von Daten an die Variable "daten" auch explizit entfernen, war sie letzte Referenz auf die Daten, werden sie sofort freigegeben, der Garbage Collector kümmert sich nicht weiter darum. (Der räumt nur zyklische Strukturen, die nicht mehr erreichbar sind weg)

Speicherverbrauch ermitteln

Verfasst: Montag 5. Februar 2007, 08:58
von sunmountain
Vielleicht hilft Dir das hier:
Unter Linux/UNIX: das Dateisystem /proc

Unter Windows:

Code: Alles auswählen

import win32process
p = win32process.GetCurrentProcess()
for i in win32process.GetProcessMemoryInfo(p).items():
    print i
Ausgabe:
('QuotaPagedPoolUsage', 52004)
('QuotaPeakPagedPoolUsage', 62420)
('QuotaNonPagedPoolUsage', 1720)
('PageFaultCount', 815)
('PeakWorkingSetSize', 3317760)
('PeakPagefileUsage', 1835008)
('QuotaPeakNonPagedPoolUsage', 1984)
('PagefileUsage', 1835008)
('WorkingSetSize', 3317760)


Beispiel Solaris 9:
ps -p 22849 -o vsz,comm
VSZ COMMAND
4264 python

Sollte unter Linux ähnlich sein.

----------------------------------------------------------------
zum Edit: pysizer ist wahrscheinlich keine gute Wahl...

Verfasst: Montag 5. Februar 2007, 16:54
von CM
Hallo Steffi,

die Antworten hier sind ja schön und gut, aber: Was willst Du denn überhaupt sortieren? Wenn es nur rel. kleine und nicht allzuviele Objekte sind, dann geht es womöglich auch im Hauptspeicher. (Einfach mal ausprobieren.)

Ansonsten: Was willst Du sortieren und wie willst Du sortieren?

Wenn der Rechner - womöglich von Dir initiiert - anfängt bei riesigen Datensätzen auszulagern und immer wieder neu einzulesen, kann das Sortieren u. U. ewig dauern. Eine Lösung könnte sein, einen Bezeichner für jedes zu sortierende Objekt zusammen mit dem Wert nachdem Du sortieren möchtest in ein dict zu laden, dann darauf Deinen Sortieralgorithmus anwenden (in eine Liste mit Tuplen oder so ausschreiben) und das Ergebnis auf Deine Datei(en) anzuwenden.

Gruß,
Christian

Verfasst: Montag 5. Februar 2007, 16:58
von Rebecca
Leute, lasst euch nicht verwirren nur weil ein Bot diesen Thread aus der Versenkung geholt hat... :wink:

Verfasst: Montag 5. Februar 2007, 17:18
von CM
*übereigenenaivitätärger* grrrh

Verfasst: Montag 5. Februar 2007, 18:18
von Leonidas
Rebecca hat geschrieben:Leute, lasst euch nicht verwirren nur weil ein Bot diesen Thread aus der Versenkung geholt hat... :wink:
Und ich hab mich schon gewundert, seit wann MvL hier wieder aktiv ist - bis ich aufs Datum geschaut habe :)