控制dict最大条目数量,然后不断的对dict增删该,发现内存不断增长。。。。
del dict[key] 以后,内存不释放的啊?
用gc也没用,内存一直增长。
1 zhyu 2015-08-01 12:58:25 +08:00 via iPhone 不释放的。你可以建个新dict把旧dict拷过去 |
3 xiazi 2015-08-01 13:00:49 +08:00 如果能确认被del的没有在其他地方被引用的话, 先清理缓存后再gc: import sys, gc sys._clear_type_cache() gc.collect() |
img src="https://cdn.v2ex.com/avatar/5e60/7d5c/79330_normal.png?m=1557395796" class="avatar" border="0" align="default" alt="twistoy" data-uid="79330" /> | 4 twistoy 2015-08-01 13:09:48 +08:00 是不会释放的。因为删除了一个item之后,还要保证hash的探测链是完整的,所以那个entry只是被标记成了空,但并没有被删除掉,这部分不在gc的范围之内的。 |
![]() | 5 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"]) |
6 invite OP |
![]() | 8 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] |
9 22too 2015-08-02 12:33:54 +08:00 个人做法,一般字典用完,在初始换一次,初始换成空字典。 a = dict () a [123] = "asdf" a = dict() |
10 fatelei 2015-08-03 15:16:01 +08:00 del dict[key],只是把对应 key-value 的 entry 删除掉,dict本身的内存如果不满足 garbage collector 回收的条件,内存是不会被释放的,还是检查一次,dict中的 key-value 为啥会让内存不断增长吧。 |