是否需要删除以释放内存[重复]
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 [重复] 重用的内存