Python列表内存错误

Python列表内存错误,python,list,memory,Python,List,Memory,我试图制作一个包含2到30个元素的列表,但是我得到了一个内存错误。为什么会这样?它是否超出了python中列表的最大限制 m=[None]*(2**30) 是的,Python列表可以容纳的元素数量是有限制的,请参阅。但是你没有击中它;很少有机器有足够的内存来保存这么多的项目 您正试图创建一个包含1073741824个引用的列表;每个引用也占用内存。这取决于您的操作系统的容量,但通常情况下,对于32位系统是4字节,对于64位操作系统是8字节,其中2^30个元素将占用4 GB或8 GB的内存,仅用

我试图制作一个包含2到30个元素的列表,但是我得到了一个内存错误。为什么会这样?它是否超出了python中列表的最大限制

m=[None]*(2**30)

是的,Python列表可以容纳的元素数量是有限制的,请参阅。但是你没有击中它;很少有机器有足够的内存来保存这么多的项目


您正试图创建一个包含1073741824个引用的列表;每个引用也占用内存。这取决于您的操作系统的容量,但通常情况下,对于32位系统是4字节,对于64位操作系统是8字节,其中2^30个元素将占用4 GB或8 GB的内存,仅用于列表引用

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个内存,仅用于引用。这比64位计算机所能解决的问题还要多


所有这些都忽略了您在列表中引用的对象将占用的内存占用
None
是一个单例,因此它只需要固定的内存量。但是,假设您要在该列表中存储其他内容,在这种情况下,您也需要考虑到这一点


一般来说,你不需要创建这么大的列表。使用不同的技术;使用字典创建稀疏结构例如,我怀疑您是否计划在算法中直接处理所有这2^30个索引。

是的,Python列表可以容纳的元素数量是有限的,请参阅。但是你没有击中它;很少有机器有足够的内存来保存这么多的项目


您正试图创建一个包含1073741824个引用的列表;每个引用也占用内存。这取决于您的操作系统的容量,但通常情况下,对于32位系统是4字节,对于64位操作系统是8字节,其中2^30个元素将占用4 GB或8 GB的内存,仅用于列表引用

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个内存,仅用于引用。这比64位计算机所能解决的问题还要多


所有这些都忽略了您在列表中引用的对象将占用的内存占用
None
是一个单例,因此它只需要固定的内存量。但是,假设您要在该列表中存储其他内容,在这种情况下,您也需要考虑到这一点


一般来说,你不需要创建这么大的列表。使用不同的技术;使用字典创建稀疏结构例如,我怀疑您是否计划在算法中直接处理所有2^30索引。

您试图在此处创建一个巨大的列表,但您没有足够的可用RAM来执行此操作。你需要多少内存

在我的机器上大约是8Gb。您可以在计算机上找到None的大小:

import sys
sys.getsizeof(None) # 16 here
但对于列表,您可以这样近似:

sys.getsizeof([None] * (2**20)) # 8388680

希望对于
2**30
来说,大约需要花费
2**10
倍的时间,最终得到的
8388680*2**10
大约是8Gb。

您试图在这里创建一个巨大的列表,但您没有足够的可用RAM来完成这项工作。你需要多少内存

在我的机器上大约是8Gb。您可以在计算机上找到None的大小:

import sys
sys.getsizeof(None) # 16 here
但对于列表,您可以这样近似:

sys.getsizeof([None] * (2**20)) # 8388680

希望对于
2**30
来说,它将花费大约
2**10
倍的时间,最终你将得到大约8Gb的
8388680*2**10

None
是一个单例,只有一个这样的对象会占用这16个字节。您可以创建任意多个引用,正是这些引用占用了内存。64位机器上的引用通常为8字节,具体取决于操作系统。我不知道这一点。谢谢你指出这个问题。更新了答案。
None
是一个单例,只有一个这样的对象会占用这16个字节。您可以创建任意多个引用,正是这些引用占用了内存。64位机器上的引用通常为8字节,具体取决于操作系统。我不知道这一点。谢谢你指出这个问题。更新了答案。