当前位置: 首页 > 面试题库 >

删除字典中的项目后,Python回收内存

沈飞翔
2023-03-14
问题内容

我在Python中有一个比较大的字典,希望不仅能够从其中删除项目,而且实际上可以从程序中的这些删除中 回收
内存。我遇到了一个问题,尽管我从字典中删除了项目,甚至手动运行了垃圾收集器,但Python似乎并没有释放内存本身。

一个简单的例子:

>>> tupdict = {}
# consumes around 2 GB of memory
>>> for i in xrange(12500000):
...   tupdict[i] = (i,i)
... 
# delete over half the entries, no drop in consumed memory
>>> for i in xrange(7500000):
...   del tupdict[i]
... 
>>> import gc
# manually garbage collect, still no drop in consumed memory after this
>>> gc.collect()
0
>>>

我想象发生了什么事,尽管删除了条目并运行了垃圾回收器,但是Python并没有继续调整字典的大小。我的问题是,是否有任何简单的方法可以解决此问题,或者我是否可能需要对我的程序编写方式进行更认真的考虑?


问题答案:

Python是否将内存返回到底层操作系统有很多因素,这可能就是您试图确定内存是否正在释放的方式。CPython有一个池化的分配器系统,该系统倾向于保留释放的内存,以便可以有效地重用它(但是从OS的角度来看,这些后续分配不会增加您的内存占用),这可能就是您所需要的。重新看到。

同样,在某些Unix平台上,进程不会在应用程序关闭(或发生其他一些重要事件)之前将释放的内存释放回OS。即使您处于释放整个池的情况(因此Python可能会决定将其释放()而不是将其保持为将来的对象打开状态),操作系统仍不会释放该内存以供其他进程使用(但可用于原始流程中的进一步重新分配)。通常,这对于减少内存碎片很有好处,并且没有太多的缺点,因为未使用的进程内存将被分页到磁盘。Windows
确实 会将进程内存释放回操作系统,以供任何新分配使用(然后您可以在任务管理器中看到),因此在Windows上尝试 出现 此问题很可能 会出现
给你不同的结果

最后,如何管理释放的进程内存是操作系统的职责范围,并且使用了各种方案(有优点也有缺点),因此仅查看您选择的系统信息工具不一定就能告诉您全部真相。 。



 类似资料:
  • 这是不是意味着我没有刷新我的适配器还是什么? @重写公共void onDeleteClick(int position){FoodInfo selectedItem; 食物适配器 } 这是我删除项目后的删除方法,它仍然存在于我的回收视图中,并在firebase中消失 我必须离开这个页面并再次访问,然后它只显示与firebase完全相同的项目 有人帮忙吗?

  • 问题内容: 在Python上进行迭代时从字典中删除项目是否合法? 例如: 这个想法是从字典中删除不满足特定条件的元素,而不是创建一个新字典,该字典是正在迭代的字典的子集。 这是一个好的解决方案吗?有没有更优雅/更有效的方法? 问题答案: 此答案不适用于,并且会给出。 :字典在迭代过程中更改了大小。 发生这种情况是因为返回的是迭代器而不是列表。正如评论中指出的那样,只需将其转换为列表即可,它应该可以

  • 本文向大家介绍在Python中迭代时从字典中删除项目,包括了在Python中迭代时从字典中删除项目的使用技巧和注意事项,需要的朋友参考一下 python字典是无序,可变和索引的集合。它们具有键和值,并且使用键来引用每个项目。在本文中,我们将探讨从字典中删除项目的方法。 与键一起使用del 在这种方法中,我们捕获了需要删除的键值。一旦应用了del函数,这些键的键值对就会被删除。 示例 输出结果 运行

  • 问题内容: 在Python中,至少有两种方法可以使用键从字典中删除项目。 两种方法都会从字典中删除项目。 我想知道这些方法之间有什么区别,以及在哪种情况下应该使用其中一种。 问题答案: 如果要 捕获已删除的项目 ,请使用,例如。 使用,如果你想 从字典中删除项目 。 如果要删除,则在密钥不在词典中时禁止显示错误:

  • 问题内容: 在Python上进行迭代时从字典中删除项目是否合法? 例如: 这个想法是从字典中删除不满足特定条件的元素,而不是创建一个新字典,该字典是正在迭代的字典的子集。 这是一个好的解决方案吗?有没有更优雅/更有效的方法? 问题答案: 此答案不适用于,并且会给出。 :字典在迭代过程中更改了大小。 发生这种情况是因为返回的是迭代器而不是列表。正如评论中指出的那样,只需将其转换为列表即可,它应该可以

  • 问题内容: 如何从以下词典中删除 u 字符? 此数据来自 find() 查询 这样看起来 问题答案: 某些数据库(例如Sqlite3)允许您定义转换器和适配器函数,因此您可以将文本检索为 str 而不是 unicode 。不幸的是,MongoDB没有为任何常见的类型(例如str,decimal或datetime)提供此选项: http://api.mongodb.org/python/curren