【问题标题】:How to delete an object in python function?如何删除python函数中的对象?
【发布时间】:2014-08-27 15:35:03
【问题描述】:

我正在使用占用大量内存的非常大的 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 数组的函数。然后该函数以某种方式处理数组,但原始对象仍保存在内存中。有没有办法释放函数内部的内存;删除引用不起作用。

【问题讨论】:

  • 删除引用不起作用,因为调用者仍然持有对该对象的引用。他们可能需要它,所以你不能只在他们身上释放它。
  • return a 添加到您的函数中,并将其称为a = do_something(a)a 最初指向的数组将没有任何指向它的引用,并将被垃圾回收。
  • 是在函数中调用 del 后立即删除还是仅在返回后才删除?

标签: python memory numpy scipy


【解决方案1】:

你想做的事做不到; Python 只会在对数组对象的所有引用都消失时释放内存,并且您不能从函数中删除调用命名空间中的a 引用。

相反,请将您的问题分解为更小的步骤。用一个函数对a 进行计算,然后删除a,然后调用另一个函数来完成剩下的工作。

【讨论】:

  • 猜猜这是要走的路。另一种解决方案是在函数中通过引用来做所有事情作为一种解决方法。
【解决方案2】:

Python 使用简单的 GC 算法,基本上它有一个引用计数(它也有一个分代 GC,但情况并非如此),这意味着对对象的每个引用都会增加一个计数器,并且每个对象超出范围缩小范围。 只有在计数器达到 0 后才会释放内存。

因此,当您引用该对象时,它会保留在内存中。

在您的情况下, do_something 的调用者仍然具有对该对象的引用,如果您希望该变量消失,您可以缩小该变量的范围。

如果您怀疑内存泄漏,您可以设置 DEBUG_LEAK 标志并检查输出,更多信息在这里:https://docs.python.org/2/library/gc.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 2016-10-28
    • 2021-01-04
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多