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

3 投票
4 回答
1021 浏览
提问于 2025-04-16 06:54

我有一些脚本,它会把很多数据加载到内存中。 我想知道这些存储在内存中的数据效率如何。 所以,我想知道在我加载数据之前,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

据我所知,没有简单的方法可以查看某个对象的内存使用情况。这是个不简单的事情,因为对象之间可能会共享引用。

这里有我最喜欢的两个解决办法:

  1. 使用进程管理器。让程序在分配内存之前暂停。先记录下分配前的内存使用情况。然后进行内存分配,再记录分配后的内存使用情况。这是个简单的方法,但确实有效。
  2. 另外,你可以使用 pickle.dump 来序列化你的数据结构。生成的pickle文件在大小上可以和存储该数据结构所需的内存空间进行比较(但不是完全相同!)。为了获得更好的结果,建议使用二进制pickle协议。

撰写回答