python - python字典可以容纳多少个元素?

标签 python dictionary out-of-memory

我刚刚在使用 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/

相关文章:

python - 为什么 range() 不返回列表?

java - 如何合并两个 HashMap 并对相同键的值求和?

c++ - 我该如何解决这个指针/内存问题?

c# - 如何在C#中打开一个大文本文件

python - 如何一一读取RabbitMQ队列消息

python - 我将如何使用 BeautifulSoup 的索引来抓取多个表?

python - 模块未找到错误: No module named 'sipdistutils' while install python-poppler-qt5

json - 使用 Swifty JSON 响应填写字典?

c++ - 如何将数据从终端传递给程序?

python - python 内存不足错误的解决方法是什么?