【问题标题】:How to implement Garbage Collection in Numpy如何在 Numpy 中实现垃圾回收
【发布时间】:2014-07-21 14:08:38
【问题描述】:

我有一个名为main.py 的文件,它引用了另一个文件Optimisers.py,其中只有函数,并在main.pyfor 循环中使用。这些函数里面有不同的优化函数。

这个Optimisers.py 然后引用了另外两个类似的文件,其中也只有函数,它们位于while 循环中。所有这些文件都使用 numpy。

我相信这是因为在 numpy 中调用和创建数组的函数的循环会导致内存过载。因此我无法完成一些优化算法,或者循环遍历所有可能的坐标。

如何确保删除 numpy 中的变量?据我了解,numpy 的 C 库使标准 Python 过程复杂化。 %reset array 命令(来自下面的链接)有什么作用?我应该在哪里实现它?

附:我读过“Releasing memory of huge numpy array in IPython”, 而gc.collect() 也不起作用。

【问题讨论】:

  • 您能发布一个演示问题的最小示例吗?尝试剥离实际的优化算法,只显示在循环中创建数组的代码,以仍然导致泄漏的方式使用它们。
  • %reset 仅适用于Ipython% 是 Ipthon 'magic' 语法的一部分),并处理其输入/输出值的缓存。除非您在 Ipython 中运行,否则这是不相关的。

标签: python python-2.7 numpy garbage-collection


【解决方案1】:

当一个 numpy 数组不再被引用时,它会被 GC 自动释放。 C 对象封装在 Python 对象中,因此对您而言,它的实现方式并不重要。

确保数组没有在全局变量中被引用,因为它们会一直存在直到被覆盖或程序退出。

如果您需要在数组超出范围之前从局部变量中释放数组,您可以使用del variablename(或仅分配例如 None),但这不会处理任何其他引用,只是命名的引用。

对于引用对象的调试,可以使用gc.get_referrers(object)

附:我读过 Releating memory of huge numpy array in IPython and gc.collect() 也不起作用。

除非您有循环或调用了gc.disable(),否则gc.collect() 不会让GC 更快发生。

【讨论】:

  • 很好的解释。此外,使用内存分析器可以帮助指出内存被占用的位置;当一个人没有线索时很有用。
  • 我尝试将所有数组分配给None 或使用gc.collect() 甚至del 运算符。可悲的是没有工作。不过,我还没有尝试对所有变量都这样做。我会试试gc.get_referrers() 谢谢。
  • 是否有一个易于使用的内存分析器可用。我仍然不知道哪个变量是。我仍然需要发布我拥有的大约 1000 行代码的精简版本(不包括 cmets)。
  • 我推荐memory_profiler,它为您提供基于每行的内存增量/减量
猜你喜欢
  • 1970-01-01
  • 2015-12-27
  • 1970-01-01
  • 2011-10-15
  • 2011-01-22
  • 1970-01-01
  • 2020-05-11
  • 2011-12-21
相关资源
最近更新 更多