我刚刚在使用 Windows 7 64 位和 Python 2.7 32 位的 python 控制台中得到以下输出:
>>> 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
为什么我不能向 dict 添加超过 21846 项?
这个数字(2 * 3 * 11 * 331)具体是什么?
注意:我的 RAM 比 sys.getsizeof(a) == 393356 多很多
最佳答案
非常惊喜!关于 Python 21846 没有什么特别之处。这是在 32 位 Windows Vista 上使用 Python 2.7.5 和适度的 3 GB RAM:
>>> a = {}
>>> for k in xrange(1000000): a[k] = k
...
>>> len(a)
1000000
1000万也可以。但这是从一个新的控制台窗口开始的。也许您在向我们展示之前做了其他事情,并留下了一些大型数据结构? 21846 以现代标准来看很小 ;-)
稍后
这已发布到 Python 的错误跟踪器,此处:http://bugs.python.org/issue19246
它被关闭为“不会修复”,因为相同类型的行为被一个简单的小纯 C 程序重现。也就是说,系统 C 的 malloc()
和 free()
是罪魁祸首,理智的 Python 对此无能为力。它似乎特定于 Windows,使用 Microsoft 的 C 库。问题是堆碎片:在分配和释放许多不同大小的对象之后,系统 malloc()
然后在请求“较大”内存块时失败,尽管有很多空闲字节可用的。但它们不在一个连续的 block 中(至少不在系统 malloc()
识别的 block 中)。
事情发生了;-)
关于python - python字典可以容纳多少个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19287103/