Speicher wird während Laufzeit nicht frei gegeben

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
chbr80
User
Beiträge: 2
Registriert: Dienstag 3. April 2007, 22:51

Hallo.

Es wurde schon einmal in ähnlicher Weise gepostet, jedoch keine Lösung angeboten:

Ich lese mit meinem Prog aus einer externen Hardware Daten aus und schreibe diese in eine .csv Datei.
Beobachte ich während dessen den Speicherbedarf von Python mit dem Taskmanager, so wächst dieser ständig weiter. Selbst wenn ich das Loggen der Daten und Schreiben in die .csv-Datei beende, die Datei speichere und schließe bleibt die Speichernutzung gleich. Starte ich das Logging wieder, so erhöht sich der Speicherbedarf weiter.

Ich habe schon gehört/gelesen, dass Python zwar Speicher wieder frei gibt, jedoch das Betriebssystem weiter Speicher für die Methode reserviert.

Wie kann ich die Speichernutzung nach Beenden des Loggings wieder reduzieren?
Ist es möglich das Betriebsystem zu veranlassen den Speicher wieder frei zu geben? Wie?

Dies passiert auch bei simpleren Programmen, wie z.B. ein einfacher Editor. Gibt man Text ein, so erhöht sich die Speichernutzung und geht auch nicht mehr zurück bis das Prog beendet wird.

Python v2.4 / Win2K / wxPython v2.7

Danke im Vorraus
Christian
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hallo chbr80, willkommen im Forum,
chbr80 hat geschrieben:Wie kann ich die Speichernutzung nach Beenden des Loggings wieder reduzieren?
Ist es möglich das Betriebsystem zu veranlassen den Speicher wieder frei zu geben? Wie?
Die Speichernutzung jedes Prozesses ist nach seinem Beenden Null. Wenn das Betriebssystem den Speicher nicht wieder freigibt liegt das in dessen Ermessen, denn freier Speicher ist unnütz. Solange kein Speichermangel herrscht, ist es egal wieviel Speicher frei ist oder nicht. Das Betriebssystem kann auch den Speicher als Cache gefüllt halten, was auf jeden Fall sinnvoller ist, als ihn leer zu lassen.

Mit anderen Worten: dein RAM-Problem ist eigentlich gar kein Problem.

Edit: Sorry, ich habe überlesen, dass das Programm nicht beendet wird, sondern nur das logging.
Zuletzt geändert von Leonidas am Mittwoch 4. April 2007, 09:13, insgesamt 1-mal geändert.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

@chbr80: Bei der Speicherverwaltung sind mehrere "Ebenen" beteiligt. Was Du im Taskmanager siehst ist der Speicher den das Betriebssystem an den Prozess vergeben hat.

Üblicherweise benutzen Programme die Funktionen `malloc()` und `free()` aus der C-Standardbibliothek zum anfordern und freigeben von Speicher. Ob oder unter welchen Bedingungen bei einem `free()` der Speicher auch wieder an das Betriebssystem "zurückgegeben" wird, ist ein Detail der verwendeten C-Standardbibliothek.

Bei CPython kommt noch eine Schicht dazwischen, weil in der Sprache sehr oft viele kleine Objekte angelegt und wieder zerstört werden. Dafür sind `malloc()` und `free()` nicht so gut geeignet. Ganz grob fordert CPython grössere Blöcke von Speicher via `malloc()` an und verwaltet die kleinen Objekte in diesem Speicherbereichen selbst. Was natürlich zur Folge hat, dass so ein Block erst wieder an `free()` übergeben werden kann, wenn er keine Objekte mehr enthält.

Das Erklärt aber noch nicht, dass der Speicherbedarf bei Deinem Programm immer weiter wächst.

Entweder Du hältst doch noch irgendwo Referenzen auf Daten, oder Du hast bei der Verarbeitung sehr viele unterschiedliche Zeichenketten, die gültige Python-Bezeichner sein können. Solche Zeichenketten werden nämlich "interned", dass heisst in eine im Interpretierer globale Tabelle eingetragen, um Dictionary-Zugriffe mit diesen Zeichenketten als Schlüssel zu beschleunigen.

Falls der wachsende Speicherverbrauch zum Problem wird, wäre die einfachste Lösung, eine Runde auslesen und loggen als Prozess zu starten.
chbr80
User
Beiträge: 2
Registriert: Dienstag 3. April 2007, 22:51

Hi.

Ich habe den Bug gefunden.

Jede, während Laufzeit ausgeführte Aktion des Progs wurde in einem Editorfenster mitgeschrieben.
Das sollte eine Debug-Funktion sein zur Beobachtung aller Aktionen. Es wurde nur vergessen, dass wenn das Loggingfenster geschlossen ist, auch das Logging zu beenden.

Jetzt ist alles i.O.

Danke für die Denkanstöße.
Antworten