如何查找Windows中Python进程/对象使用的内存总量
我有一些脚本,它会把很多数据加载到内存中。 我想知道这些存储在内存中的数据效率如何。 所以,我想知道在我加载数据之前,Python使用了多少内存,以及在我加载数据之后又用了多少内存。 另外,我也想知道有没有办法检查复杂对象的内存使用情况。 比如说,我有一个嵌套的字典,里面有不同类型的数据。我怎么才能知道这个字典里的所有数据占用了多少内存呢? 谢谢, 亚历克斯
4 个回答
2
为了分析一个对象占用了多少内存,你可以使用 Pympler 这个工具:
>>> from pympler import asizeof
>>> obj = dict(nested=dict(trash=[1,2,3]))
>>> asizeof.asizeof(obj)
800
>>> asizeof.asizeof(obj['nested'])
480
>>> asizeof.asizeof(obj['nested']['trash'])
160
>>> asizeof.asizeof(obj['nested']['trash'][0])
24
2
你可以看看这个guppy包,它可以告诉你每个加载的对象使用了多少内存。不过不幸的是,它似乎不支持Python 2.6及以上的版本,但如果你使用的是Python 2.5或更早的版本,那就没问题。
使用起来非常简单,只需要在你想要收集内存信息的代码中加上这几行:
from guppy import hpy
hp = hpy()
print hp.heap()
这样就会得到类似下面的输出:
Partition of a set of 25961 objects. Total size = 1894868 bytes.
Index Count % Size % Cumulative % Kind (class / dict of class)
0 11901 46 775408 41 775408 41 str
1 6040 23 219964 12 995372 53 tuple
2 1718 7 116824 6 1112196 59 types.CodeType
3 73 0 113608 6 1225804 65 dict of module
4 348 1 107232 6 1333036 70 dict (no owner)
5 196 1 100192 5 1433228 76 dict of type
6 1643 6 92008 5 1525236 80 function
7 209 1 90572 5 1615808 85 type
8 144 1 76800 4 1692608 89 dict of class
9 984 4 35424 2 1728032 91 __builtin__.wrapper_descriptor
5
据我所知,没有简单的方法可以查看某个对象的内存使用情况。这是个不简单的事情,因为对象之间可能会共享引用。
这里有我最喜欢的两个解决办法:
- 使用进程管理器。让程序在分配内存之前暂停。先记录下分配前的内存使用情况。然后进行内存分配,再记录分配后的内存使用情况。这是个简单的方法,但确实有效。
- 另外,你可以使用
pickle.dump
来序列化你的数据结构。生成的pickle文件在大小上可以和存储该数据结构所需的内存空间进行比较(但不是完全相同!)。为了获得更好的结果,建议使用二进制pickle协议。