是否需要删除以释放内存[重复]

Posted

技术标签:

【中文标题】是否需要删除以释放内存[重复]【英文标题】:Is a delete needed to free up memory [duplicate] 【发布时间】:2019-04-21 07:30:49 【问题描述】:

我有以下代码,我在其中重新分配了几个 GB 的列表:

    res = self.dict_cursor.fetchall()
    res_with_offers = []

    # we add in HDBUY, SDBUY for now -- HARDCODED
    for item in res:
        for avail_code in ['HDBUY', 'SDBUY']:
            _item = deepcopy(item)
            _item['avail_code'] = avail_code
            res_with_offers.append(_item)

    del res; # <== is this line needed?
    res = res_with_offers

我的理解是del res;,因为它下面一行的变量重新分配会删除内存中的初始res 项目。它是否正确?为什么或为什么不?

【问题讨论】:

顺便说一句,支持结构共享的语言可能更适合解决您的问题,同时保持内存使用受到限制——在 Clojure,f/e 中,您不需要 deepcopy(),因为原生类型/结构首先是不可变的(并且创建一个带有更改的新列表/字典不会改变任何东西,除了树中进行更改的点的父级,减少了实际的内容量需要复制)。 【参考方案1】:

标识符可以绑定到 Python 中的对象,也可以不绑定到任何东西。就是这样。

如果identifier 绑定到一个对象,del identifier 将删除绑定,使identifier 不绑定到任何对象。 就是这样。对内存是否释放没有直接影响。

当对象的最后一个绑定被删除时,该对象就可以进行垃圾回收了。不是在那之前。

在您展示的代码中,实际上无法确定最初绑定到res 的对象何时符合垃圾回收条件。据我们所知,例如,在

res = self.dict_cursor.fetchall()

fetchall() 从内部持久缓存返回一个对象。那么

del res

将通过res 删除与对象的绑定,但不会影响与对象的任何其他可能绑定。在 所有 绑定消失之前,无法回收该对象。

无论如何,del res 在:

del res
res = anything

没有真正的目的。无论del res 是否存在,res 最终都会绑定到anything,因此无论del res 是否存在,res 的原始绑定也会被删除。

【讨论】:

嗯,内存溢出情况可能会有一点的不同:当没有del完成时,那么旧值会在一段时间内仍然存在而不是收藏品,同时分配新值。如果之前完成了 del,Python 可能会使用 gc 并存活而不是内存溢出。

以上是关于是否需要删除以释放内存[重复]的主要内容,如果未能解决你的问题,请参考以下文章

删除智能指针的内存释放不起作用[重复]

删除/释放由 malloc 分配并由 new [重复] 重用的内存

在 C 或 C++ 中释放内存 [重复]

在c ++中删除和释放向量内存的正确方法(防止不同的内存相关错误)

释放一维数组内存的功能[重复]

证明 shrink_to_fit 或 swap 保证释放向量的内存 [重复]