Fer*_*aft 7 python memory dictionary list python-2.7
我正在使用便携式python 2.7.5.1.
以下行:
x = [{} for i in range(11464882)]
Run Code Online (Sandbox Code Playgroud)
导致内存错误(没有其他消息):
>>>
Traceback (most recent call last):
File "<module1>", line 12, in <module>
MemoryError
>>>
Run Code Online (Sandbox Code Playgroud)
注意:第1-11行只有注释.
减少错误上方有趣数字中的一个单位消失.
考虑到1100万不是那么大,我相信必须有一些简单的设置可以增加我的程序可用的内存量.
那么,这是一个简单的我缺少的东西或固有的内存限制?
Mar*_*ers 10
在我的Mac OS X 10.8.5 64位笔记本电脑上,range(11464882)对象需要:
>>> import sys
>>> sys.getsizeof(range(11464882))
91719128
>>> sys.getsizeof(11464881) # largest number
24
>>> sys.getsizeof(0) # smalest number
24
>>> 91719128 + (24 * 11464882) # bytes
366876296
>>> (91719128 + (24 * 11464882)) / (1024.0 ** 2) # mb
349.88050079345703
Run Code Online (Sandbox Code Playgroud)
350兆字节的内存.
这里,sys.getsizeof()返回给定Python对象的内存占用量,不包括所包含的值.因此,对于列表,它只是列表结构所需的内存; 簿记信息加上1100万个64位指针.
此外,许多空字典采取:
>>> sys.getsizeof({})
280
>>> 91719128 + 280 * 11464882
3301886088
>>> (91719128 + 280 * 11464882) / (1024.0 ** 2) # mb
3148.923957824707
>>> (91719128 + 280 * 11464882) / (1024.0 ** 3) # gb
3.0751210525631905
Run Code Online (Sandbox Code Playgroud)
3千兆字节的内存.1,100万次280字节是很多空间.
与其他开销(很可能是垃圾收集周期检测,Python进程本身和memoized值)一起,这意味着您可以达到机器每进程4GB的内存限制.
如果您运行的是32位二进制文件,则尺寸会更小,因为您只需要32位指针的空间,但您也只能获得2GB的可寻址内存以适应您的所有对象.