Python >> Tutoriel Python >  >> Python Tag >> Array

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

Cela est probablement dû au mode de gestion de surengagement de votre système.

En mode par défaut, 0 ,

Gestion heuristique du surengagement. Les dépassements évidents d'espace d'adressage sont refusés. Utilisé pour un système typique. Il garantit un échec d'allocation sérieusement sauvage tout en permettant une surengagement pour réduire l'utilisation du swap. root est autorisé à allouer un peu plus de mémoire dans ce mode. C'est la valeur par défaut.

L'heuristique exacte utilisée n'est pas bien expliquée ici, mais cela est discuté plus sur Linux que sur l'heuristique de commit et sur cette page.

Vous pouvez vérifier votre mode de surengagement actuel en exécutant

$ cat /proc/sys/vm/overcommit_memory
0

Dans ce cas, vous allouez

>>> 156816 * 36 * 53806 / 1024.0**3
282.8939827680588

~ 282 Go, et le noyau dit bien évidemment qu'il n'y a aucun moyen que je puisse y consacrer autant de pages physiques, et il refuse l'allocation.

Si (en tant que root) vous exécutez :

$ echo 1 > /proc/sys/vm/overcommit_memory

Cela activera le mode "toujours surengagement", et vous constaterez qu'en effet le système vous permettra d'effectuer l'allocation, quelle que soit sa taille (au moins dans un adressage mémoire 64 bits).

Je l'ai testé moi-même sur une machine avec 32 Go de RAM. Avec le mode overcommit 0 J'ai aussi un MemoryError , mais après l'avoir changé en 1 ça marche :

>>> import numpy as np
>>> a = np.zeros((156816, 36, 53806), dtype='uint8')
>>> a.nbytes
303755101056

Vous pouvez ensuite continuer et écrire à n'importe quel emplacement du tableau, et le système n'allouera des pages physiques que lorsque vous écrivez explicitement sur cette page. Vous pouvez donc l'utiliser, avec précaution, pour les tableaux clairsemés.


J'ai eu le même problème sur Windows et suis tombé sur cette solution. Donc, si quelqu'un rencontre ce problème sous Windows, la solution pour moi était d'augmenter la taille du fichier d'échange, car c'était aussi un problème de surengagement de mémoire pour moi.

Windows 8

  1. Sur le clavier Appuyez sur la touche Windows + X puis cliquez sur Système dans le menu contextuel
  2. Appuyez ou cliquez sur Paramètres système avancés. Il peut vous être demandé un mot de passe administrateur ou de confirmer votre choix
  3. Dans l'onglet Avancé, sous Performances, appuyez ou cliquez sur Paramètres.
  4. Appuyez ou cliquez sur l'onglet Avancé, puis, sous Mémoire virtuelle, appuyez ou cliquez sur Modifier
  5. Décochez la case Gérer automatiquement la taille du fichier d'échange pour tous les lecteurs.
  6. Sous Drive [Volume Label], appuyez ou cliquez sur le lecteur contenant le fichier d'échange que vous souhaitez modifier
  7. Appuyez ou cliquez sur Taille personnalisée, saisissez une nouvelle taille en mégaoctets dans la zone Taille initiale (Mo) ou Taille maximale (Mo), appuyez ou cliquez sur Définir, puis appuyez ou cliquez sur OK
  8. Redémarrez votre système

Windows 10

  1. Appuyez sur la touche Windows
  2. Tapez SystemPropertiesAdvanced
  3. Cliquez sur Exécuter en tant qu'administrateur
  4. Sous Performances, cliquez sur Paramètres
  5. Sélectionnez l'onglet Avancé
  6. Sélectionnez Modifier...
  7. Décochez Gestion automatique de la taille du fichier d'échange pour tous les lecteurs
  8. Ensuite, sélectionnez Taille personnalisée et remplissez la taille appropriée
  9. Appuyez sur Set, puis sur OK, puis quittez la boîte de dialogue Mémoire virtuelle, options de performances et propriétés système
  10. Redémarrez votre système

Remarque :Je n'avais pas assez de mémoire sur mon système pour les ~282 Go dans cet exemple, mais dans mon cas particulier, cela a fonctionné.

MODIFIER

À partir d'ici, les recommandations suggérées pour la taille du fichier de page :

Il existe une formule pour calculer la taille correcte du fichier d'échange. La taille initiale est égale à une fois et demie (1,5) x la quantité totale de mémoire système. La taille maximale est de trois (3) x la taille initiale. Disons donc que vous disposez de 4 Go (1 Go =1 024 Mo x 4 =4 096 Mo) de mémoire. La taille initiale serait de 1,5 x 4 096 =6 144 Mo et la taille maximale serait de 3 x 6 144 =18 432 Mo.

Certaines choses à garder à l'esprit à partir d'ici :

Cependant, cela ne prend pas en compte d'autres facteurs importants et paramètres système qui peuvent être propres à votre ordinateur. Encore une fois, laissez Windows choisir quoi utiliser au lieu de vous fier à une formule arbitraire qui a fonctionné sur un autre ordinateur.

Aussi :

L'augmentation de la taille du fichier d'échange peut aider à prévenir les instabilités et les plantages dans Windows. Cependant, les temps de lecture/écriture d'un disque dur sont beaucoup plus lents que ce qu'ils seraient si les données se trouvaient dans la mémoire de votre ordinateur. Avoir un fichier de page plus volumineux ajoutera du travail supplémentaire à votre disque dur, ce qui ralentira tout le reste. La taille du fichier d'échange ne doit être augmentée qu'en cas d'erreurs de mémoire insuffisante, et uniquement en tant que solution temporaire. Une meilleure solution consiste à ajouter plus de mémoire à l'ordinateur.


J'ai également rencontré ce problème sous Windows. La solution pour moi était de passer d'une version 32 bits à une version 64 bits de Python . En effet, un logiciel 32 bits, comme un CPU 32 bits, peut adresser au maximum 4 Go de RAM (2^32). Donc si vous avez plus de 4 Go de RAM, une version 32 bits ne pourra pas en profiter.

Avec une version 64 bits de Python (celle étiquetée x86-64 dans la page de téléchargement), le problème a disparu.

Vous pouvez vérifier quelle version vous avez en entrant l'interpréteur. Moi, avec une version 64 bits, j'ai maintenant :Python 3.7.5rc1 (tags/v3.7.5rc1:4082f600a5, Oct 1 2019, 20:28:14) [MSC v.1916 64 bit (AMD64)] , où [MSC v.1916 64 bits (AMD64)] signifie "Python 64 bits".

Remarque :au moment d'écrire ces lignes (mai 2020), matplotlib n'est pas disponible sur python39, je recommande donc d'installer python37, 64 bits.

Sources :

  • Quora - erreur de mémoire générée par un grand tableau numpy

  • Stackoverflow :version 32 ou 64 bits de Python