【问题标题】:How to free the memory of a dictionary of dictionaries?如何释放字典词典的内存?
【发布时间】:2014-05-15 13:12:27
【问题描述】:

考虑一本字典:

bigDict = { 'user1': userDict1, 'user2': userDict2 } 

假设它包含数百万用户,我想在处理完整个事情后释放内存。

以下是否足够:

del bigDict

或者我需要做类似的事情:

for userId, userDict in bigDict.iteritems():
    del userDict

【问题讨论】:

  • 除非其他对象引用子字典,del bigDict 就足够了。
  • 不要忘记释放的内存是否会返回给操作系统取决于解释器的实现。在 CPython 的情况下,解释器会重用内存。

标签: python memory dictionary del


【解决方案1】:

如果对您的字典的唯一引用在 bigDict 中,则只需删除它就会触发垃圾收集器。如果外部有引用,使用循环删除它们中的每一个都不会做任何事情,因为del 只是意味着“减少引用计数”,并且当且仅当计数器变为零,该对象将被删除。

确保对象被释放的最简单方法是在可能的情况下在闭包中创建和使用它。所以你有一个函数,它在主体内部创建大字典,处理它,一旦完成,返回一组值。这样您就可以确定没有杂散的引用。当然,在大多数实际用途中,这是不可能的。

需要注意的是,如果同时有很多小对象存活,它们的内存不会返回给操作系统,而是作为新对象的池保存。 (此行为在 Python 3 中得到了部分改进)。如果内存管理很重要,您可能希望使用数组对象,这样它们就不再是 对象了(并在此过程中节省了一些开销)。

【讨论】:

  • 您确定删除bigDict 会触发垃圾收集器吗?如果我没记错的话,它只是将其标记为可删除(以便以后可以在需要时删除)。
  • 嗯,它确实触发了它,但可能不是中间的。这是一个关于它的讨论:pyvideo.org/video/2633/garbage-collection-in-python
猜你喜欢
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 2013-02-07
相关资源
最近更新 更多