web-dev-qa-db-fra.com

Impossible d'allouer le tableau avec la forme et le type de données

Je suis confronté à un problème d'allocation d'énormes tableaux dans numpy sur Ubuntu 18 sans être confronté au même problème sur MacOS.

J'essaie d'allouer de la mémoire pour un tableau numpy avec la forme (156816, 36, 53806) avec

np.zeros((156816, 36, 53806), dtype='uint8')

et pendant que je reçois une erreur sur Ubuntu OS

>>> import numpy as np
>>> np.zeros((156816, 36, 53806), dtype='uint8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
numpy.core._exceptions.MemoryError: Unable to allocate array with shape (156816, 36, 53806) and data type uint8

Je ne l'obtiens pas sur MacOS:

>>> import numpy as np 
>>> np.zeros((156816, 36, 53806), dtype='uint8')
array([[[0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        ...,
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0]],

       [[0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        ...,
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0]],

       [[0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        ...,
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0]],

       ...,

       [[0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        ...,
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0]],

       [[0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        ...,
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0]],

       [[0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        ...,
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0]]], dtype=uint8)

J'ai lu quelque part que np.zeros ne devrait pas vraiment allouer toute la mémoire nécessaire au tableau, mais uniquement aux éléments non nuls. Même si la machine Ubuntu a 64 Go de mémoire, alors que mon MacBook Pro n'en a que 16 Go.

versions:

Ubuntu
os -> ubuntu mate 18
python -> 3.6.8
numpy -> 1.17.0

mac
os -> 10.14.6
python -> 3.6.4
numpy -> 1.17.0

PS: a également échoué sur Google Colab

53
Martin Brišiak

Dans mon cas, l'ajout d'un attribut dtype a changé le type de tableau du tableau en un type plus petit (de float64 à uint8), réduisant suffisamment la taille du tableau pour ne pas lancer MemoryError dans Windows (64 bits).

de

mask = np.zeros(edges.shape)

à

mask = np.zeros(edges.shape,dtype='uint8')
0
Pragya Agrawal

Parfois, cette erreur apparaît car le noyau a atteint sa limite. Essayez de redémarrer le noyau refaire les étapes nécessaires.

0