如何在Windows中查找python进程/对象使用的内存总量

时间:2010-11-11 14:00:38

标签: python windows memory-management

我有一些脚本可以将大量数据加载到内存中。 我想知道存储在内存中的数据有多高效。 所以,我希望能够知道在加载数据之前以及加载数据之后python使用了多少内存。 另外我想知道,如果它是某种方式来检查复杂对象的内存使用情况。 假设我有嵌套字典,里面有不同类型的数据。我怎么知道这本词典中所有数据使用了多少内存。 谢谢, 亚历

4 个答案:

答案 0 :(得分:5)

据我所知,没有简单的方法可以看出某个对象的内存消耗是多少。这将是一件非常重要的事情,因为引用可以在对象之间共享。

以下是我最喜欢的两种解决方法:

  1. 使用流程管理器。让程序在分配之前暂停。记下分配前使用的内存。分配。分配后记下内存。这是一种低技术方法,但它有效。
  2. 或者,您可以使用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的性能计数器