Python 列表内存错误
Python list memory error
我正在尝试创建一个包含 2 个元素到 30 个元素的列表,但出现内存错误。为什么这样?它是否超出了 python 中列表的最大限制?
m=[None]*(2**30)
是的,Python 列表可以容纳的元素数量是有限制的,请参阅 sys.maxsize
。但是你没有击中它;很少有机器有足够的内存来容纳那么多项目。
您正在尝试创建一个包含 1073741824 个引用的列表;每个引用也占用内存。这取决于您的 OS 多少,但对于 32 位系统通常是 4 个字节,对于 64 位 OS 是 8 个字节,其中 2^30 个元素将占用 4 GB或 8GB 内存,仅用于列表引用。
4GB 加上其他元素已经很容易超过大多数当前操作系统允许单个进程在内存中使用的容量。
在我的MacOSX机器上(使用64位OS),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 of memory, just for the references. That is more than what a 64-bit computer could address (the practical maximum is about 16 exbibytes).
所有这些都忽略了您在列表中引用的对象将占用的内存空间。 None
是一个单例,所以它只会占用固定数量的内存。但大概你要在那个列表中存储一些东西 else,在这种情况下你也需要考虑到这一点。
一般来说,您永远不需要创建这么大的列表。使用不同的技术;例如,使用字典创建稀疏结构,我怀疑您是否打算直接在算法中处理所有这些 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。
我正在尝试创建一个包含 2 个元素到 30 个元素的列表,但出现内存错误。为什么这样?它是否超出了 python 中列表的最大限制?
m=[None]*(2**30)
是的,Python 列表可以容纳的元素数量是有限制的,请参阅 sys.maxsize
。但是你没有击中它;很少有机器有足够的内存来容纳那么多项目。
您正在尝试创建一个包含 1073741824 个引用的列表;每个引用也占用内存。这取决于您的 OS 多少,但对于 32 位系统通常是 4 个字节,对于 64 位 OS 是 8 个字节,其中 2^30 个元素将占用 4 GB或 8GB 内存,仅用于列表引用。
4GB 加上其他元素已经很容易超过大多数当前操作系统允许单个进程在内存中使用的容量。
在我的MacOSX机器上(使用64位OS),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 of memory, just for the references. That is more than what a 64-bit computer could address (the practical maximum is about 16 exbibytes).
所有这些都忽略了您在列表中引用的对象将占用的内存空间。 None
是一个单例,所以它只会占用固定数量的内存。但大概你要在那个列表中存储一些东西 else,在这种情况下你也需要考虑到这一点。
一般来说,您永远不需要创建这么大的列表。使用不同的技术;例如,使用字典创建稀疏结构,我怀疑您是否打算直接在算法中处理所有这些 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。