Ich habe eine große Reihe von Rasterdatensätzen, die monatliche Niederschläge über mehrere Jahrzehnte darstellen. Ich habe ein Skript in Python geschrieben, das in Schleifen über jedes Raster läuft und Folgendes tut:
- Konvertiert das Raster in ein maskiertes Numpy-Array,
- Führt eine Menge Array-Algebra aus, um einen neuen Wasserstand zu berechnen,
- Schreibt das Ergebnis in ein Ausgaberaster.
- Wiederholungen
Das Skript besteht lediglich aus einer langen Liste von Array-Algebra-Gleichungen, die von einer Schleifenanweisung eingeschlossen sind.
Alles funktioniert gut, wenn ich das Skript nur auf einem kleinen Teil meiner Daten (z. B. 20 Jahre) ausführe, aber wenn ich versuche, die gesamte Menge zu verarbeiten, erhalte ich eine MemoryError
. Die Fehlermeldung gibt nicht mehr Informationen als das (außer dass sie die Zeile im Code hervorhebt, in der Python aufgegeben hat).
Leider kann ich meine Daten nicht einfach in Stücken verarbeiten - ich muss wirklich alles auf einmal machen können. Das liegt daran, dass am Ende jeder Iteration die Ausgabe (Wasserstand) als Startpunkt in die nächste Iteration zurückgeführt wird.
Mein Verständnis von Programmierung ist im Moment sehr einfach, aber ich dachte, dass alle meine Objekte bei jeder Schleife einfach überschrieben werden. Ich bin (dummerweise?) davon ausgegangen, dass der Code, wenn er einmal erfolgreich eine Schleife durchlaufen hat, in der Lage sein sollte, unendlich viele Schleifen zu durchlaufen, ohne immer mehr Speicher zu verbrauchen.
Ich habe versucht, verschiedene Teile der Dokumentation zu lesen und habe etwas entdeckt, das sich "Garbage Collector" nennt, aber ich habe das Gefühl, dass ich überfordert bin und mein Gehirn schmilzt! Kann mir jemand einen Einblick geben, was eigentlich mit den Objekten im Speicher passiert, wenn mein Code in Schleifen läuft? Gibt es eine Möglichkeit, den Speicher am Ende jeder Schleife freizugeben, oder gibt es eine eher "pythonische" Art der Codierung, die dieses Problem gänzlich vermeidet?
1 Stimmen
Ich glaube nicht, dass man Ihnen viel helfen kann, ohne den Quellcode zu sehen.