如何在Numpy中实现垃圾回收
我有一个叫做 main.py
的文件,它引用了另一个文件 Optimisers.py
,这个文件里只有一些函数,并且在 main.py
的一个 for
循环中使用这些函数。这些函数包含了不同的优化算法。
而这个 Optimisers.py
还引用了另外两个类似的文件,这些文件里也只有函数,并且在 while
循环中使用。所有这些文件都用到了 numpy 库。
我觉得问题出在这些循环中,因为函数在调用和创建 numpy 数组,这导致了内存过载。因此,我无法完成一些优化算法,也无法遍历我想要的所有可能坐标。
我该如何确保清除 numpy 中的变量?我了解到,numpy 的 C 库让标准的 Python 处理变得复杂。那 %reset array
这个命令(来自下面的链接)是干什么的?我应该在哪里使用它?
附注:我看过 "在 IPython 中释放巨大 numpy 数组的内存",而且 gc.collect()
也没用。
1 个回答
当一个numpy数组不再被引用时,垃圾回收器(GC)会自动释放它的内存。C语言的对象被封装在Python对象里,所以你不需要关心它是怎么实现的。
要确保数组没有被全局变量引用,因为全局变量会一直存在,直到被覆盖或者程序结束。
如果你想在局部变量超出作用域之前释放一个数组,可以使用del variablename
(或者直接赋值为None),但这样只会处理你指定的那个引用,不会影响其他引用。
如果你想调试一下哪里引用了一个对象,可以使用gc.get_referrers(object)
。
附言:我看过关于在IPython中释放大numpy数组内存的内容,发现
gc.collect()
也不起作用。
除非你有循环引用或者调用了gc.disable()
,否则gc.collect()
不会让垃圾回收器更早地工作。