Wie kontrolliere ich, wieviel ich schon im Hauptspeicher hab

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
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
loewis
User
Beiträge: 4
Registriert: Montag 5. August 2002, 10:48

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.
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)
Benutzeravatar
sunmountain
User
Beiträge: 89
Registriert: Montag 13. März 2006, 17:18

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...
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Leute, lasst euch nicht verwirren nur weil ein Bot diesen Thread aus der Versenkung geholt hat... :wink:
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

*übereigenenaivitätärger* grrrh
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 :)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten