我正在使用非常大的numpy / scipy数组,占用大量内存。假设我的代码如下所示:
def do_something(a):
a = a / a.sum() #new memory is allocated
#I don't need the original a now anylonger, how to delete it?
#do a lot more stuff
#a = super large numpy array
do_something(a)
print a #still the same as originally (as passed by value)
所以我用一个巨大的numpy数组调用一个函数。然后该函数以某种方式处理数组,但原始对象仍保留在内存中。有没有办法释放函数内部的内存;删除引用不起作用。
答案 0 :(得分:3)
你想要的是什么; Python只会在对数组对象的所有引用都消失后释放内存,并且您无法从函数中删除调用命名空间中的a
引用。
相反,将您的问题分解为更小的步骤。使用一个函数在a
上进行计算,然后删除a
,然后调用另一个函数来完成其余的工作。
答案 1 :(得分:0)
Python使用简单的GC算法,基本上它有一个引用计数(它也有一个世代GC,但事实并非如此),这意味着每个对象的引用都会增加一个计数器,并且每个对象都超出范围减少范围。 只有在计数器达到0后才会释放内存。
所以当你引用那个对象时,它会继续记忆。
在你的情况下,do_something的调用者仍然有对象的引用,如果你希望这个变量消失,你可以减少该变量的范围。
如果您怀疑内存泄漏,可以设置DEBUG_LEAK标志并检查输出,更多信息请点击此处:https://docs.python.org/2/library/gc.html