Python:如何估算/计算数据结构的内存占用?

15

如何估算一个对象的内存占用?

反过来,如何测量它的占用空间?

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

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

我有4GB的物理内存,想大致计算在溢出到交换空间前,我可以存储多少行(键:值对)在内存中。这是在Linux/Ubuntu 8.04和OS X 10.5.6上。

此外,最佳方法是什么,以确定我的程序实际的内存占用情况?如何最好地确定它何时会耗尽物理内存并发生溢出?


当你说“一个对象”时,可能你想处理的情况是它可以是任意深度嵌套的对象,并且具有对其他对象/字符串/数组等的(多个,可能是别名)引用。 - smci
2个回答

10

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文档比较少,所以你可能需要从网页或源代码中挖掘一下,但它非常强大。此外,还有一些相关的文章


1
为什么在'd'中有6个'str'对象? - Dustin Boswell
当绑定一个新变量时,会创建一个新的字符串('d')。属性查找(堆)占据了另一个。我不知道其余部分来自哪里。 - Torsten Marek
实际结果会有所不同,您必须要么根据您使用的特定解释器实现进行检查,要么进行一些试错以找到差异。例如,我刚刚尝试了上面的示例,它报告了三个字符串,总计96字节。 - stw_dev

5
您可以使用内存分析器来完成此操作,我知道有几个内存分析器可供选择:
  1. PySizer - 可能已经过时,因为主页现在推荐:

  2. Heapy

这可能是 此问题 的重复。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接