-->

Python - Delete (remove from memory) a variable fr

2019-06-20 14:53发布

问题:

I have to load this massive object A (that can weight almsot 10go) that I need to pass to a function, that extracts from it a parameter B to further exert some heavy computations on it.

A = load(file)

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

In order to free some memory (as I already had a MemoryError), I'd like to remove A from memory right after its transformation to B. I tried del but it doesn't seem to affect the existence of A at the script level. I also tried del global()["A"] but it says that A is not defined as a global variable.

Is there a way to do it? Thanks!

回答1:

del A will simply remove A from the local scope of function (see this answer). A will still persist in the global scope. To remove it from the global scope you can either use a closure (and declare global A) or with python3 you can also use the keyword nonlocal. However this only removes the binding from the scope and does not guarantee that the corresponding memory is freed. This happens when the object is garbage collected. You can force garbage collection via the gc module (see this answer).

However if you are running into memory problems, instead of loading the whole data set, you could maybe use a view onto the data set and only process (load) a part of it at a time (i.e. stream-process the data).



回答2:

I believe reassigning A within the function could achieve the effect you are looking for.

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


回答3:

Perhaps loading the object from inside the function would work here, since A will go out of scope once the function returns and no longer take up the memory in the same way(A will probably still exist in memory, but that memory should now be available for other use again when needed). Maybe try something like this:

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)

Then just call function_B(file)