2 votes

Dépassement de mémoire dans un tableau booléen numpy

J'essaie de créer un grand tableau booléen (pour un crible de nombres premiers). J'ai d'abord utilisé des listes Python, mais à limit = 10^9 cela a créé un MemoryError .

boolarray = [True] * limit

Puis j'ai appris l'existence de Numpy et j'ai lu qu'il était meilleur avec l'organisation de l'espace, donc j'ai essayé

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

La limite n'a été augmentée que de façon marginale pour atteindre 10^10 ce qui n'est pas suffisant, puisque j'ai besoin 10^12 . Je trouve cela surprenant, vous avez juste besoin d'un bit pour les booléens, n'est-ce pas ? Une idée, comment surmonter ce problème ? Merci d'avance.

2voto

kazemakase Points 2505

Mettons de côté le fait que 10^12 bits ne tiendront probablement pas facilement dans la mémoire. Si vous vous souciez plus de l'utilisation de la mémoire que des performances, vous pouvez regrouper les bits dans un tableau d'octets. Cela se fait au prix de calculs supplémentaires lors de la lecture/écriture des bits (c'est la raison pour laquelle numpy stocke les booléens sous forme d'octets).

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X