numpy布尔数组中的内存溢出

时间:2017-11-20 11:57:16

标签: python python-3.x numpy boolean

我正在尝试创建一个大型布尔数组(用于素数筛)。我使用了第一个Python列表,但在limit = 10^9处创建了MemoryError

boolarray = [True] * limit

然后我了解了Numpy并了解到空间组织更好,所以我尝试了

boolarray = np.full(limit, True, dtype = bool)

这个限制只是略微增加到10^10,这还不够,因为我需要10^12。我觉得这很令人惊讶,你只需要布尔一点,不是吗?任何想法,如何克服这个问题?提前谢谢。

1 个答案:

答案 0 :(得分:2)

让我们撇开10 ^ 12位可能不容易融入内存的事实。如果您更关心内存使用情况而不是性能,则可以将这些位打包成字节数组。这是以读取/写入位时的额外计算为代价的(这是numpy将布尔值存储为字节的原因)。

import numpy as np


def getbit(bitarray, index):
    i, j = index // 8, index % 8
    x = bitarray[i]
    return x & (1 << j) != 0


def setbit(bitarray, index, value):
    value = bool(value)
    i, j = index // 8, index % 8
    x = bitarray[i]
    bitarray[i] ^= (np.uint(-value) ^ x) & (1 << j)


n = 10**5 // 8
bitarray = np.zeros(n, dtype=np.uint8)  # initialize all bits to 0

print(getbit(bitarray, 19))  # False

setbit(bitarray, 19, True)
print(getbit(bitarray, 19))  # True

setbit(bitarray, 19, False)
print(getbit(bitarray, 19))  # False