Python内存使用:我的哪个对象占用了最多内存?

5 投票
1 回答
743 浏览
提问于 2025-04-16 00:15

我写的程序存储了大量的数据,主要是用字典来存储。具体来说,我创建了1588个类的实例,每个实例里面有15个字典,每个字典里有1500个浮点数到浮点数的映射。这个过程让我笔记本电脑的2GB内存很快就用完了(大约在创建到第1000个实例时,我的电脑开始使用交换空间)。

我想问的是,以下哪一项在消耗我的内存呢?

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

在我看来,消耗内存的应该是我存储的那些大量浮点数。不过,如果我读到的内容是对的,每个浮点数占用16个字节。因为我有3400万个浮点数对,所以这大约是1.08亿字节,应该就超过1GB了。

我是不是忽略了什么呢?

1 个回答

7

每个浮点数占用16个字节,而一个包含1500个条目的字典大约占用100KB:

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

所以这22500个字典单独就占用了超过2GB,6800万个浮点数又大约占用1GB。对于6800万乘以16怎么会只等于100MB,我不太明白——你可能在某个地方漏掉了一个零。

这个类本身占用的空间非常少,1500个实例(当然不包括它们所引用的对象,就像getsizeof给我们提供的字典的净值一样)每个实例的占用空间也就和一个小字典差不多,所以这根本不是问题。也就是说:

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

类占用452字节,(524 + 32) * 1550 = 862KB是所有实例的总和,正如你所看到的,当字典和浮点数每个都占用几个GB时,这根本不值得担心。

撰写回答