Python heapy报告内存使用情况<&书信电报;顶部

Python heapy报告内存使用情况<&书信电报;顶部,python,memory-management,Python,Memory Management,注意:这是我第一次尝试使用Python进行内存分析,所以我可能问错了问题。再次改进问题的建议值得赞赏 我正在编写一些代码,需要在集中存储几百万个小字符串。根据top,它使用的内存量是报告的~3倍。我不清楚所有这些额外的内存是用来做什么的,我如何才能着手弄清楚我是否可以——如果可以的话,如何——减少占地面积 memtest.py: 来自guppy import hpy的 导入gc hp=hpy() #在此处进行设置-打开文件并初始化保存数据的类 打印'gc',gc.collect() hp.set

注意:这是我第一次尝试使用Python进行内存分析,所以我可能问错了问题。再次改进问题的建议值得赞赏

我正在编写一些代码,需要在
集中存储几百万个小字符串。根据
top
,它使用的内存量是报告的~3倍。我不清楚所有这些额外的内存是用来做什么的,我如何才能着手弄清楚我是否可以——如果可以的话,如何——减少占地面积

memtest.py:

来自guppy import hpy的

导入gc
hp=hpy()
#在此处进行设置-打开文件并初始化保存数据的类
打印'gc',gc.collect()
hp.setrelheap()
原始输入('relheap set-enter to continue')#顶部显示驻留在python中的14MB
#将数据从文件加载到类中
打印'gc',gc.collect()
h=hp.heap()
打印h
原始输入('enter to quit')#顶部显示python的743MB常驻值
输出为:

$python memtest.py
gc 5
重新堆集-输入以继续
gc 2
一组3197065对象的分区。总大小=263570944字节。
索引计数%Size%累计%Kind(类/类的目录)
0 3197061 100 263570168100 263570168100 str
1 1 0 448 0 263570616 100类型。FrameType
2 1 0 280 0 263570896 100 dict(无所有者)
31 0 24 0 263570920 100浮点数
410240263570944100内部
总之,heapy显示264MB,而top显示743MB。什么在使用额外的500MB

更新:
我在Windows7的VirtualBox中运行64位python,运行的是Ubuntu12.04 我按照答案安装了guppy:

sudo-pip安装https://guppy-pe.svn.sourceforge.net/svnroot/guppy-pe/trunk/guppy

首先,您在哪个平台上?如果它是64位的,您使用的是32位还是64位Python?无论如何,我猜heapy用C malloc术语报告当前堆的使用情况,并且您的解释器有
malloc
'd然后
free
'd 500MB,这还没有被操作系统回收,但这只是一个猜测。我只是尝试
pip安装guppy
,自己尝试一下。在我的64位Mac上,我收到了大量警告,因为它假设sizeof(unsigned long)为4或将unsigned long转换为int。然后,一旦您尝试导入它,就会得到一整串错误。尽管它的版本是0.1.9,并且从0.1.8开始,它应该“可以使用64位和Python 2.6”。也许它不适用于Python2.7?也许它就是不起作用?@abarnert为你更新了一些答案。有没有办法确定内存是否是非空闲的——如果这不是一个真正的问题,那就太好了。我应该注意到我使用了另一种安装方式,因为显然标准安装在Py2.7上不起作用。我不能说这一个是否有效,但它确实给出了更合理的结果,而我不知道如何使用top所说的内存量,因为我实际存储的是什么。@abarnert Addition-如果heapy不起作用,我想问题是‘我如何找出什么在使用这么多内存并修复它?’heapy是最好的(唯一的?)到目前为止,我已经找到了解决方案。我尝试安装trunk版本而不是最新版本(使用命令行),并且…现在我收到了不同的64位警告,但它们看起来同样严重。无论如何,除了1页的教程、不会在Acrobat或Preview中呈现的PDF以及pkgcore上的404链接之外,还有更多关于heapy的文档吗?