web-dev-qa-db-fra.com

Quelle est la taille maximale d'un tableau numpy?

J'essaie de créer une matrice contenant 2 708 000 000 éléments. Lorsque j'essaie de créer un tableau numpy de cette taille, cela me donne une erreur de valeur. Existe-t-il un moyen d'augmenter la taille maximale du tableau?

a = np.arange (2708000000)

ValueError Traceback (dernier appel le plus récent)

ValueError: taille maximale autorisée dépassée

26
branwen85

Vous essayez de créer un tableau avec 2,7 milliards d'entrées. Si vous utilisez numpy 64 bits, à 8 octets par entrée, ce serait 20 Go en tout.

Il est donc presque certain que vous venez de manquer de mémoire sur votre machine. Il n'y a pas de taille de tableau maximale générale dans numpy.

16
shoyer

Une ValueError indique que la taille est trop grande pour l'allocation, pas qu'il n'y a pas assez de mémoire. Sur mon ordinateur portable, en utilisant du python 64bits, je peux l'allouer si je réduit le nombre de bits:

In [16]: a=np.arange(2708000000)
---------------------------------------------------------------------------
MemoryError                               Traceback (most recent call last)
<ipython-input-16-aaa1699e97c5> in <module>()
----> 1 a=np.arange(2708000000)

MemoryError: 

# Note I don't get a ValueError

In [17]: a = np.arange(2708000000, dtype=np.int8)

In [18]: a.nbytes
Out[18]: 2708000000

In [19]: a.nbytes * 1e-6
Out[19]: 2708.0

Dans votre cas, arange utilise int64 bits, ce qui signifie qu'il est 16 fois plus, soit environ 43 Go. un processus 32 bits ne peut accéder qu'à environ 4 Go de mémoire.

La raison sous-jacente est la taille des pointeurs utilisés pour accéder aux données et le nombre de chiffres que vous pouvez représenter avec ces bits:

In [26]: np.iinfo(np.int32)
Out[26]: iinfo(min=-2147483648, max=2147483647, dtype=int32)
In [27]: np.iinfo(np.int64)
Out[27]: iinfo(min=-9223372036854775808, max=9223372036854775807, dtype=int64)

Notez que je peux répliquer votre ValueError si j'essaie de créer un tableau absurdement grand:

In [29]: a = np.arange(1e350)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-29-230a6916f777> in <module>()
----> 1 a = np.arange(1e350)

ValueError: Maximum allowed size exceeded

Si votre machine a beaucoup de mémoire, comme vous l'avez dit, ce sera 64 bits, vous devez donc installer Python 64 bits pour pouvoir y accéder. Par contre, pour de si gros ensembles de données, vous devriez envisager la possibilité d'utiliser des calculs hors du noyau.

10
Davidmh

J'ai pu créer un tableau d'une taille de 6 milliards qui a consommé jusqu'à 45 Go de mémoire. Par défaut, numpy a créé le tableau avec un dtype de float64. En abandonnant la précision, j'ai pu économiser beaucoup de mémoire.

np.arange(6000000000,dtype=np.dtype('f8'))
np.arange(6000000000,dtype=np.dtype('f4'))
#etc...

par défaut == float64

  • np.float64 - 45,7 Go

  • np.float32 - 22,9 Go

  • np.int8 - 5.7GB

De toute évidence, un entier 8 bits ne peut pas stocker une valeur de 6B. Je suis sûr qu'une taille maximale existe à un moment donné, mais je soupçonne que c'est loin de tout ce qui est possible en 2016. Fait intéressant, "Python Blaze" vous permet de créer des tableaux numpy sur le disque. Je me souviens d'avoir joué avec il y a quelque temps et d'avoir créé un tableau extrêmement grand qui occupait 1 To de disque.

6
J'e