【问题标题】:Memory footprint of big python dictionaries after all keys beeing removed删除所有键后大 python 字典的内存占用
【发布时间】:2020-12-16 22:38:46
【问题描述】:

最后一天我在 python 中做一个简单的测试,想知道巨大的字典(大约 1000 万个键)对内存的影响是什么,以及如何有效地清空它们(不是一次所有的键)。我使用 clear() 方法作为参考,我正在寻找在删除所有键后仍在使用的内存量。

在我的测试中,clear() 方法非常擅长删除内存并将其归还给操作系统,而当我使用delpop 时,删除所有键后消耗的内存仍然很大。为了测量一个对象使用的内存,我使用了一个在线找到的函数,该函数位于源代码的开头(也可以使用here)。

popdel相比,clear 方法的效率如何?

我的测试代码和测试结果可以在here找到。

感谢您的帮助。

【问题讨论】:

  • clear() 方法知道它正在删除所有内容,因此它可以回收所有内存。删除字典中间的单个元素不允许回收其余内存,除非它重新散列字典。
  • 另外,您可以通过将字典替换为副本来强制调整大小。
  • @scenox 是的,这就是我通常的做法。在极少数情况下,我已经建立了一个巨大的字典,我必须把它精简下来,然后我会为了效率而做所有的del d[key],但最后一个d = dict(d.items()) 尽管d.copy() 可能就足够了
  • @juanpa.arrivillaga 感谢您的解决方法:)

标签: python dictionary memory


【解决方案1】:

为避免过多的哈希表重建,popdel 不要调整 dict 的底层哈希表的大小。一个一个地删除条目永远不会缩小字典的哈希表。

仅当字典在插入时空间不足时才会调整大小(由于虚拟条目在实现中的工作方式,这可以缩小字典),或者如果不相关的技术细节强制重建(例如必须取消拆分拆分表字典)。

clear 将完全丢弃旧的哈希表。

【讨论】:

  • 感谢您的解释!这个答案加上对问题本身的其他评论对我有帮助:)
猜你喜欢
  • 2019-01-24
  • 1970-01-01
  • 2014-09-02
  • 2011-04-25
  • 2011-10-11
  • 2012-09-05
  • 2014-01-08
  • 1970-01-01
  • 2017-12-31
相关资源
最近更新 更多