python字典可以包含多少个元素?

pet*_*min 2 python dictionary out-of-memory

我刚刚在python控制台中使用Windows 7 64位和Python 2.7 32位获得以下输出:

>>> a = {}
>>> for k in xrange(1000000): a[k] = k
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
MemoryError
>>> len(a)
21846
>>> a[21846]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 21846
>>> a[21846] = 21846
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
MemoryError
Run Code Online (Sandbox Code Playgroud)

为什么我不能添加超过21846项dict?

这个号码的具体内容是什么(2*3*11*331)?

注意:我有比sys.getsizeof(a)== 393356更多的RAM

Tim*_*ers 6

非常令人惊讶!关于21846,Python并没有什么特别之处.这里是32位Windows Vista与Python 2.7.5以及适度的3 GB RAM:

>>> a = {}
>>> for k in xrange(1000000): a[k] = k
...
>>> len(a)
1000000
Run Code Online (Sandbox Code Playgroud)

也可以用1000万.但这是从一个新的控制台窗口开始的.也许你在向我们展示之前做了其他的事情,并留下了一些大型数据结构?按现代标准来看,21846很小;-)

后来

这是发布到Python的bug跟踪器,在这里:http: //bugs.python.org/issue19246

它被关闭为"不会修复",因为同一种行为被一个简单的小纯C程序所复制.也就是说,系统的C的malloc()free()是罪魁祸首,并没有什么理智的Python可以做的.它似乎特定于Windows,使用Microsoft的C库.问题是堆碎片:在分配和释放许多不同大小的对象之后,系统malloc()在被要求"大"的内存块时失败,尽管有大量可用的空闲字节.但它们并不是一个连续的块(至少在一个系统中没有malloc()识别出来).

东西发生;-)