【问题标题】:Python: How to estimate / calculate memory footprint of data structures?Python:如何估计/计算数据结构的内存占用?
【发布时间】:2010-10-19 11:24:55
【问题描述】:

估计对象内存占用的好方法是什么?

相反,测量足迹的好方法是什么?

例如,假设我有一个字典,其值是整数列表,浮点元组:

d['key'] = [ (1131, 3.11e18), (9813, 2.48e19), (4991, 9.11e18) ]

我有 4G 的物理内存,想弄清楚在我溢出到交换之前我可以在内存中存储大约多少行(键:值)。这是在 linux/ubuntu 8.04 和 OS X 10.5.6 上。

另外,找出我的程序实际内存占用的最佳方法是什么?我如何最好地确定它何时耗尽物理内存并溢出?

【问题讨论】:

  • 当你说“一个对象”时,大概你想处理它可以是一个任意深度嵌套的对象,以及对其他对象/字符串/数组等的(多个,可能是别名的)引用。

标签: python memory-management memory-size


【解决方案1】:

您可以使用内存分析器来执行此操作,我知道其中有几个:

  1. PySizer - 可能已过时,正如主页现在建议的那样:

  2. Heapy.

这可能与this 问题重复。

【讨论】:

    【解决方案2】:

    Guppy 有一个不错的内存分析器(Heapy):

    >>> from guppy import hpy
    >>> hp = hpy()
    >>> hp.setrelheap() # ignore all existing objects
    >>> d = {}
    >>> d['key'] = [ (1131, 3.11e18), (9813, 2.48e19), (4991, 9.11e18) ]
    >>> hp.heap()
     Partition of a set of 24 objects. Total size = 1464 bytes.
     Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
         0      2   8      676  46       676  46 types.FrameType
         1      6  25      220  15       896  61 str
         2      6  25      184  13      1080  74 tuple
     ...
    

    Heapy 的文档有些不足,因此您可能需要深入研究网页或源代码,但它非常强大。还有一些articles 可能是相关的。

    【讨论】:

    • 为什么'd'中有6个'str'对象?
    • 绑定新变量时,会创建一个新字符串('d')。属性查找(堆)占另一个。我不知道其余的来自哪里。
    • 实际结果各不相同,您必须对照您正在使用的特定解释器实现检查它们,或者进行一些试验和错误以找出差异。例如,我刚刚尝试了上面的示例,它报告了三个总共 96 字节的字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-31
    • 2018-09-03
    • 2010-12-05
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    相关资源
    最近更新 更多