我正在尝试制作一个包含2个增加到30个元素的列表但是出现内存错误。为什么这样?它是否超出了python中列表的最大限制?
m=[None]*(2**30)
答案 0 :(得分:5)
是的,Python列表可容纳的元素数量有限,请参阅sys.maxsize
。但是你没有击中它;很少有机器有足够的内存来容纳那么多项目。
您正在尝试创建一个包含1073741824引用的列表;每个参考也需要记忆。它取决于你的操作系统多少,但通常对于32位系统来说是4个字节,对于64位操作系统来说是8个字节,其中2 ^ 30个元素需要4 GB或8GB内存,仅供列表参考。
4GB以及其他元素已经比大多数当前操作系统允许单个进程在内存中使用的内容容易得多。
在我的Mac OS X计算机上(使用64位操作系统),sys.maxsize
为2 ^ 63,列表中的Python对象引用占用8个字节:
>>> import sys
>>> sys.maxsize
9223372036854775807
>>> sys.maxsize.bit_length()
63
>>> sys.getsizeof([]) # empty list overhead
72
>>> sys.getsizeof([None]) - sys.getsizeof([]) # size of one reference
8
因此,要创建包含sys.maxsize
元素的列表,您需要64 exbibytes个内存,仅用于参考。这不仅仅是64位计算机可以解决的问题(practical maximum is about 16 exbibytes)。
所有这些都忽略了您在列表中引用的对象所占用的内存占用量。 None
是一个单身人士,因此它只会占用一定数量的内存。但是大概你要在那个列表中存储一些 else ,在这种情况下你也需要考虑到这一点。
一般来说,你永远不应该需要来创建这么大的列表。使用不同的技术;例如,使用字典创建稀疏结构,我怀疑您是否计划直接在算法中处理所有这些2 ^ 30索引。
答案 1 :(得分:0)
您正在尝试在此处创建一个巨大的列表,并且您没有足够的可用RAM来执行此操作。你需要多少RAM?
我的机器上大约是8Gb。您可以在您的机器上找到无尺寸:
import sys
sys.getsizeof(None) # 16 here
但是对于列表,您可以这样近似:
sys.getsizeof([None] * (2**20)) # 8388680
并希望对于2**30
,大约需要2**10
次,最终会得到大约8Gb的8388680 * 2**10
。