2014-04-20 45 views
4

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

size1 = sys.getsizeof(mydict)/(1024**2) 
print size1 
size2 = 0 
for i in mydict.keys(): 
    size2 += sys.getsizeof(i) 
print size2/(1024**2) 
size3 = 0 
for i in mydict.keys(): 
    size3 += sys.getsizeof(mydict[i]) 
print size3/(1024**2) 
size4 = 0 
for i in mydict.keys(): 
    for j in mydict[i]: 
     size4 += j 
print size4/(1024**2) 
现在
print str(size1 + size2 + size3 + size4) 

如果我删除字典

del(mydict) 
gc.collect() 

小于400MB从内存释放。 即使我从字典里面的列表中首先删除所有的项目,释放的内存不会超过450-500 MB ..所以我最终没有变量在我的shell中,但仍然消耗了3,5GB ..任何人都可以解释发生了什么?

+0

如果在删除前设置了'mydict = None',会发生什么? – CoDEmanX

+0

相同的东西.. 400MB释放 – tk66

+0

字典的内容是什么?由于python处理小数字或相同对象的方式,您可能会在计算大小时重复计算。 – ebarr

回答

2

有要记住两两件事:

即使删除整个对象,蟒蛇可能保留进一步使用该内存(而不是后来再次分配内存)。 python在os中留下的脚印不会有太大改变。

在Linux和基于UNIX的系统上,进程不一定会在应用程序停止前返回分配的内存。

为了成功释放内存,您可能需要查看garbage collector。有了它,你可以强制python释放分配的内存。

+0

感谢您的回复!它确实清楚了一点。但我已经使用垃圾收集器(gc.collect())清理后,我删除字典内容和字典,并没有帮助。我会更好看! – tk66

+0

你,先生,哪里正确!我加载了字典,删除了它,然后重新加载,并且使用的总内存与第一次相同!谢谢 – tk66