假设有一个dict变量在运行时变得非常大 - 达到数百万个键:值对。
这个变量是否存储在RAM中,有效地耗尽了所有可用内存并减慢了系统的其余部分?
要求翻译显示整个字典是一个坏主意,但只要一次访问一个密钥就可以了吗?
答案 0 :(得分:9)
是的,dict将存储在进程内存中。因此,如果它变得足够大以至于系统RAM中没有足够的空间,那么当系统开始与磁盘交换内存时,您可能会看到大幅减速。
其他人说过几百万件物品不应该成问题;我不确定。 dict开销本身(在计算键和值所占用的内存之前)非常重要。对于Python 2.6或更高版本,sys.getsizeof提供了一些有关各种Python结构占用RAM的有用信息。一些快速的结果,来自64位OS X机器上的Python 2.6:
>>> from sys import getsizeof
>>> getsizeof(dict((n, 0) for n in range(5462)))/5462.
144.03368729403149
>>> getsizeof(dict((n, 0) for n in range(5461)))/5461.
36.053470060428495
因此,dict开销在每个项目36个字节和每个项目144个字节之间变化(确切的值取决于字典的内部哈希表的填充程度;这里5461 = 2 ** 14 // 3是其中之一内部哈希表被放大的阈值)。这是在添加dict项目本身的开销之前;如果它们都是短字符串(比如6个字符或更少),那么每个项目仍然会增加另一个> = 80字节(如果许多不同的密钥共享相同的值,则可能更少)。
因此, 数百万个dict项目不会耗尽典型计算机上的RAM。
答案 1 :(得分:5)
数以百万计的项目主要关注的不是字典本身,而是每个项目占用多少空间。不过,除非你做一些奇怪的事,否则他们应该适合。
如果你有一个拥有数百万个密钥的字典,你可能会做错事。你应该做一个或两个:
找出你应该实际使用的数据结构,因为单个dict可能不是正确的答案。这究竟是什么取决于你正在做什么。
使用数据库。你的Python应该附带一个sqlite3模块,所以这是一个开始。
答案 2 :(得分:4)
是的,Python dict
存储在RAM中。然而,几百万个键对于现代计算机来说不是问题。如果您需要越来越多的数据并且RAM用完,请考虑使用真实的数据库。选项包括关系数据库,如SQLite(顺便说一下,内置在Python中)或像Redis这样的键值存储。
在解释器中显示数百万个项目毫无意义,但访问单个元素应该仍然非常有效。
答案 3 :(得分:2)
就我所知,Python使用最好的散列算法,因此您可能会获得最佳的内存效率和性能。现在,整个事物是保存在RAM中还是提交到交换文件取决于您的操作系统,取决于您拥有的RAM量。 我想说的最好是尝试一下:
from random import randint
a = {}
for i in xrange(10*10**6):
a[i] = i
运行它时看起来如何?在我的系统上大约需要350Mb,这至少可以说是可以管理的。