新人求教: Python 删除 dict 一个 item 后,内存不释放的?

2015-08-01 12:33:04 +08:00
 invite

控制dict最大条目数量,然后不断的对dict增删该,发现内存不断增长。。。。

del dict[key] 以后,内存不释放的啊?

用gc也没用,内存一直增长。

8055 次点击
所在节点    Python
10 条回复
zhyu
2015-08-01 12:58:25 +08:00
不释放的。你可以建个新dict把旧dict拷过去
invite
2015-08-01 13:00:45 +08:00
@zhyu 那旧的dict拷贝过去了,旧的会被释放掉么?
xiazi
2015-08-01 13:00:49 +08:00
如果能确认被del的没有在其他地方被引用的话, 先清理缓存后再gc:
import sys, gc
sys._clear_type_cache()
gc.collect()
twistoy
2015-08-01 13:09:48 +08:00
是不会释放的。因为删除了一个item之后,还要保证hash的探测链是完整的,所以那个entry只是被标记成了空,但并没有被删除掉,这部分不在gc的范围之内的。
ruoyu0088
2015-08-01 18:16:07 +08:00
你是说字典不释放空间还是被删除的对象不被释放,如果是对象不被释放,也许还有别的引用。你可以用getrefcount()查看引用计数,如果计数为2,那么删除该对象,它就会被回收:

import gc
import sys
o = object()
d = {"a": object(), "b":o}

print sys.getrefcount(d["a"])
print sys.getrefcount(d["b"])
invite
2015-08-01 21:15:14 +08:00
@ruoyu0088

字典里原来的对象没有释放。对象从字典删除后,打印出来计数器为2,但是内存一直增长。
不知道有没有什么工具可以看到底是什么原因引起的?
invite
2015-08-01 21:20:30 +08:00
@twistoy 啊?那如果是这样的话,dict不是不适合经常增删改的了?
Feiox
2015-08-01 21:53:26 +08:00
为什么我测试的,完全不存在楼主遇到的问题,版本 Py 3.4,代码如下:
a = {}

while True:
key = int(random.random() * 1000000)
a[key] = [time.time()] * 10000000
del a[key]
22too
2015-08-02 12:33:54 +08:00
个人做法,一般字典用完,在初始换一次,初始换成空字典。
a = dict ()
a [123] = "asdf"
a = dict()
fatelei
2015-08-03 15:16:01 +08:00
del dict[key],只是把对应 key-value 的 entry 删除掉,dict本身的内存如果不满足 garbage collector 回收的条件,内存是不会被释放的,还是检查一次,dict中的 key-value 为啥会让内存不断增长吧。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/210030

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX