Python内存管理-字典

4

我有一个保存在文件中的字典。我从Python交互式shell中将字典加载到内存中,我的系统监视器显示Python进程消耗了4GB内存。 以下命令给出以下输出:

size1 = sys.getsizeof(mydict)/(1024**2)
print size1

96

size2 = 0
for i in mydict.keys():
    size2 += sys.getsizeof(i)
print size2/(1024**2)

37
size3 = 0
for i in mydict.keys():
    size3 += sys.getsizeof(mydict[i])
print size3/(1024**2)

981

size4 = 0
for i in mydict.keys():
    for j in mydict[i]:
        size4 += j
print size4/(1024**2)

2302

print str(size1 + size2 + size3 + size4)

3416

现在如果我删除这个词典

del(mydict)
gc.collect()

释放的内存不到400MB。即使我从字典中的列表中逐一删除所有项目,释放的内存也不超过450-500MB。因此,尽管我的shell中没有变量,但仍然消耗了3.5GB的内存。有人能解释这是怎么回事吗?


如果在删除之前设置 mydict = None,会发生什么? - CodeManX
同样的事情.. 释放了400MB - tk66
字典的内容是什么?由于Python处理小数字或相同对象的方式,您的大小计算可能会重复计算。 - ebarr
1个回答

2

需要记住的两件事:

即使您删除了整个对象,Python 也可能会将该内存保留供以后使用(而不是稍后再次分配内存)。Python 在操作系统中留下的印记不会显着改变。

在基于 Linux 和 UNIX 的系统上,进程不一定会归还已分配的内存,直到应用程序死亡为止。

为了成功释放内存,您可能需要查看垃圾回收器。使用它,您可以强制 Python 释放已分配的内存。


谢谢您的回复!这确实让事情清楚了一些。但我已经使用垃圾收集器(gc.collect())来在删除字典内容和字典后进行清理,但它没有起到作用。我会再仔细研究一下! - tk66
先生,您是正确的!我加载了字典,删除了它,然后再次加载,使用的总内存与第一次相同!谢谢。 - tk66

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接