在Python中预分配非常大的数组会导致MemoryError

时间:2017-06-30 19:24:22

标签: python arrays list python-3.x memory

我正在尝试在python中预分配列表

c=[1]*mM #preallocate array

我的问题是我从

开始遇到MemoryError
mM=4999999950000000

解决这个问题的最佳方法是什么?我正在考虑创建一个新对象,将我的列表拆分为大约500000000的值。 这是我应该做的,还是有最好的做法来创建一个包含大量输入的数组?

1 个答案:

答案 0 :(得分:4)

使用生成器

您正在尝试创建一个极有可能无法放入计算机内存的对象。如果您确实需要表示该长度的列表,则可以使用生成器根据需要动态生成值。

def ones_generator(length):
    for _ in range(length):
        yield 1

gen = ones_generator(4999999950000000)
for i in gen:
    print(i)  # prints 1, a lot

注意:此问题已标记为Python 3,但如果您使用的是Python 2.7,则需要使用xrange而不是range

使用字典

根据您的问题,您实际上并不需要预先分配该长度的列表,但是您希望将值非常稀疏地存储在非常大的索引中。此模式与Python中的dict类型相匹配,而不是list。您可以简单地将值存储在字典中,而无需预先分配它们的键/空间,Python会为您处理这些内容。

dct = {}
dct[100000] = "A string"
dct[592091] = 123
dct[4999999950000000] = "I promise, I need to be at this index"

print(dct[4999999950000000])
# I promise, I need to be at this index

在该示例中,我只存储了strint值,但它们可以是Python中的任何对象。关于这一点的最好的部分是这个字典不会消耗基于最大索引的内存(比如list会),而是基于存储在其中的值的数量。