我有一些脚本可以将大量数据加载到内存中。 我想知道存储在内存中的数据有多高效。 所以,我希望能够知道在加载数据之前以及加载数据之后python使用了多少内存。 另外我想知道,如果它是某种方式来检查复杂对象的内存使用情况。 假设我有嵌套字典,里面有不同类型的数据。我怎么知道这本词典中所有数据使用了多少内存。 谢谢, 亚历
答案 0 :(得分:5)
据我所知,没有简单的方法可以看出某个对象的内存消耗是多少。这将是一件非常重要的事情,因为引用可以在对象之间共享。
以下是我最喜欢的两种解决方法:
pickle.dump
序列化数据结构。生成的pickle在大小上与在内存中存储数据结构所需的空间相当(不相同!)。为了获得更好的结果,请使用二进制pickle协议。答案 1 :(得分: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
答案 2 :(得分: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
答案 3 :(得分:0)
另一种方法是你可以通过pywin32
使用windows的性能计数器