web-dev-qa-db-de.com

Python - Löschen (aus dem Speicher entfernen) einer Variablen aus einer Funktion?

Ich muss dieses massive Objekt A laden (das almsot 10go gewichten kann), das ich an eine Funktion übergeben muss, die daraus einen Parameter B extrahiert, um einige schwere Berechnungen darauf weiter auszuführen.

A = load(file)

def function(A):    
   B = transorm(A)    
   B = compute(B)
   return(B)

Um etwas Speicher freizugeben (da ich bereits einen MemoryError hatte), möchte ich A direkt nach seiner Umwandlung in B aus dem Speicher entfernen. Ich habe versucht, del zu verwenden, aber es scheint die Existenz von A auf Skriptebene nicht zu beeinträchtigen . Ich habe auch del global()["A"] ausprobiert, aber es heißt, dass A nicht als globale Variable definiert ist.

Gibt es eine Möglichkeit, dies zu tun? Vielen Dank!

4

del A entfernt einfach A aus dem lokalen Bereich von function (siehe diese Antwort ). A bleibt im globalen Bereich bestehen. Um es aus dem globalen Bereich zu entfernen, können Sie entweder einen Abschluss verwenden (und global A deklarieren) oder mit python3 auch das Schlüsselwort nonlocal verwenden. Dies entfernt jedoch nur die Bindung aus dem Bereich und garantiert nicht, dass der entsprechende Speicher freigegeben wird. Dies passiert, wenn das Objekt Müll gesammelt ist. Sie können die Garbage Collection über das Modul gc erzwingen (siehe diese Antwort ).

Wenn jedoch Speicherprobleme auftreten, können Sie statt des Ladens des gesamten Datensatzes möglicherweise eine Ansicht auf den Datensatz verwenden und nur einen Teil davon gleichzeitig verarbeiten (laden) (d. H. Die Daten streamen).

1
a_guest

Vielleicht würde das Laden des Objekts aus der Funktion heraus hier funktionieren, da A den Gültigkeitsbereich verlässt, sobald die Funktion zurückkehrt und den Speicher nicht mehr auf die gleiche Weise belegt (A wird wahrscheinlich noch im Speicher vorhanden sein, aber dieser Speicher sollte jetzt verfügbar sein bei Bedarf erneut für andere Zwecke verwenden). Vielleicht versuchen Sie etwas wie folgt:

f = file                 # assuming file is not the memory hog

def function_A(file):
    A = load(file)       # A is created in the local scope of the function
    return transform(A)  # A will go out of scope, freeing the memory for use

def function_B(file): 
   B = function_A(file)  # when this returns the memory should be available again
   return compute(B)

Dann rufen Sie einfach function_B(file) an

0
Totem

Ich glaube, die Neuzuweisung von A innerhalb der Funktion könnte den gewünschten Effekt erzielen.

def function(A):
    B = transform(A)
    A = None
    B = compute(B)
    return(B)
0
Kumar