代码之家  ›  专栏  ›  技术社区  ›  Wilduck

python内存使用:我的哪些对象占用的内存最多?

  •  5
  • Wilduck  · 技术社区  · 14 年前

    我编写的程序将大量数据存储在字典中。具体来说,我正在创建一个类的1588个实例,每个实例包含15个字典,其中有1500个浮点到浮点映射。这个过程很快就耗尽了我笔记本电脑上的2GB内存(我开始写东西来交换这个类的第1000个实例)。

    我的问题是,以下哪一项耗尽了我的记忆?

    • 3400万对浮点数?
    • 22500本字典的开销?
    • 1500个班级的开销?

    在我看来,记忆之猪应该是我在记忆中保存的大量浮点数。但是,如果到目前为止我读到的内容是正确的,那么我的每个浮点数就占16个字节。因为我有3400万对,所以这应该是1.08亿字节,刚好超过1千兆字节。

    这里有什么我不考虑的吗?

    1 回复  |  直到 9 年前
        1
  •  7
  •   Alex Martelli    14 年前

    每个浮点数确实占用16个字节,一个包含1500个条目的dict约为100k:

    >> sys.getsizeof(1.0)
    16
    >>> d = dict.fromkeys((float(i) for i in range(1500)), 2.0)
    >>> sys.getsizeof(d)
    98444
    

    因此,22500个听写机本身就占据了2GB的容量,6800万个听写机的容量又增加了一GB左右。不知道你怎么计算6800万乘以16,等于100米——你可能在某个地方降了0。

    类本身所占的数量可以忽略不计,它的1500个实例(当然是它们所指对象的净值,正如 getsizeof 给了我们这么多的净听写量)不超过一个小听写每个,所以,这几乎不是问题。即。:

    >>> sys.getsizeof(Sic)
    452
    >>> sys.getsizeof(Sic())
    32
    >>> sys.getsizeof(Sic().__dict__)
    524
    

    452班, (524 + 32) * 1550 =862K对于所有的实例,正如您所看到的,当您在dict和float中都有千兆字节时,这不是问题。