Python内存使用:我的哪个对象占用了最多内存?
我写的程序存储了大量的数据,主要是用字典来存储。具体来说,我创建了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时,这根本不值得担心。