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

如何在windows中查找python进程/对象使用的内存总量,python,windows,memory-management,Python,Windows,Memory Management,我有一些脚本,可以将大量数据加载到内存中。 我想知道存储在内存中的数据有多高效。 所以,我想知道python在加载数据之前和加载数据之后使用了多少内存。 我还想知道,这是否是检查复杂对象内存使用情况的某种方法。 假设我有一个嵌套字典,里面有不同类型的数据。我怎么知道这本字典中的所有数据使用了多少内存。 谢谢 Alex据我所知,没有简单的方法可以看出某个对象的内存消耗是多少。这将是一件非常重要的事情,因为引用可以在对象之间共享 以下是我最喜欢的两种变通方法: 使用流程管理器。分配前让程序暂停一段时

我有一些脚本,可以将大量数据加载到内存中。 我想知道存储在内存中的数据有多高效。 所以,我想知道python在加载数据之前和加载数据之后使用了多少内存。 我还想知道,这是否是检查复杂对象内存使用情况的某种方法。 假设我有一个嵌套字典,里面有不同类型的数据。我怎么知道这本字典中的所有数据使用了多少内存。 谢谢
Alex

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

以下是我最喜欢的两种变通方法:

  • 使用流程管理器。分配前让程序暂停一段时间。写下分配前使用的内存。分配分配后写下内存。这是一种低技术的方法,但它是有效的
  • 或者,您可以使用
    pickle.dump
    序列化数据结构。生成的pickle在大小上与在内存中存储数据结构所需的空间相当(不完全相同!)。为了获得更好的结果,请使用二进制pickle协议

  • 您可以查看这个包,它可以为您提供有关每个加载对象所使用内存的信息。不幸的是,它在python>=2.6下似乎不起作用,但如果您最多使用Python2.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
    

    为了分析对象使用的内存量,您可以使用:


    另一种选择是,您可以通过pywin32使用windows的性能计数器,我的错误是,它最多与python2.5兼容,而不是与2.6兼容
    >>> 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