web-dev-qa-db-fra.com

Pourquoi Python `Memory Error` avec la liste` append () `beaucoup de RAM la gauche

Je construis un grand dictionnaire de données à partir d'un ensemble de fichiers texte. Pendant que je lis les lignes et que je les traite, je append(dataline) à une liste.

À un moment donné, append() génère une exception Memory Error. Cependant, en regardant le programme s'exécuter dans le gestionnaire de tâches Windows, au moment du crash, je vois 4,3 Go disponibles et 1,1 Go disponibles.

Ainsi, je ne comprends pas la raison de l'exception.

La version Python est 2.6.6. J'imagine que la seule raison est qu'il n'est pas en mesure d'utiliser plus de RAM disponible. Si tel est le cas, est-il possible d'augmenter l'allocation?

21
Pete

Si vous utilisez une version 32 bits de Python, vous pouvez essayer une version 64 bits.

Il est possible qu'un processus adresse au plus 4 Go de RAM à l'aide d'adresses 32 bits, mais en général (selon le système d'exploitation), on en obtient beaucoup moins. Il semble que votre processus Python atteigne cette limite. L'adressage 64 bits supprime cette limitation.

edit Puisque vous parlez de Windows, la page suivante est pertinente: Limites de mémoire pour les versions de Windows . Comme vous pouvez le constater, la limite par processus 32 bits est de 2, 3 ou 4 Go selon la version et la configuration du système d'exploitation.

27
NPE

Si vous êtes prêt à restructurer le code au lieu de lui donner plus de mémoire, vous pourrez peut-être vous en sortir avec ceci:

data = (processraw(raw) for raw in lines)

lines est une liste de lignes ou file.xreadlines() ou similaire.

5
nmichaels

J'ai eu un problème similaire en utilisant une version 32 bits de python dans un environnement Windows 64 bits. J'ai essayé la version 64 bits de python sous Windows et j'ai très rapidement rencontré des problèmes avec les bibliothèques Scipy compilées pour les fenêtres 64 bits.

La solution totalement gratuite que j’ai mise en place était 

1) Installer VirtualBox
2) Installer CentOS 5.6 sur la machine virtuelle
3) Obtenez la distribution Python d’Enthought (version Linux 64 bits gratuite). 

Désormais, tout mon code python dépendant de Numpy, Scipy et Matplotlib peut utiliser autant de mémoire que j'ai le RAM et la permutation Linux disponible.

4
Stu

J'ai eu un problème similaire lors de l'évaluation d'une expression contenant de grands tableaux numpy (en fait, l'un d'entre eux était clairsemé). Je faisais cela sur un ordinateur doté de 64 Go de mémoire, dont seulement 8 Go environ étaient utilisés, alors j'ai été surpris de recevoir la MemoryError.

Il s’est avéré que mon problème était la diffusion sous forme de matrice: j’avais dupliqué par inadvertance une grande dimension.

Cela ressemblait à ceci: 

  • J'avais passé un tableau de forme (286577, 1) où je m'attendais (286577)
  • Cela a été sous-extrait d'un tableau de forme (286577, 130)
  • Comme je m'attendais à (286577), j'ai appliqué [:,newaxis] dans l'expression pour la porter à (286577,1) afin qu'elle soit diffusée à (286577,130)
  • Cependant, lorsque j'ai passé la forme (286577,1), [:,newaxis] a généré une forme (286577,1,1) et les deux tableaux ont été diffusés sur une forme (286577,286577,130) ... de doubles. Avec deux de ces baies, cela représente environ 80 Go!
3
drevicko

Comme cela a déjà été mentionné, vous aurez besoin d'un python64 bits (d'une version 64 bits de Windows). 

Sachez que vous rencontrerez probablement de nombreux conflits et problèmes avec certains des packages de base avec lesquels vous voudrez peut-être travailler. pour éviter ce problème, je recommanderais Anaconda de Continuum Analytics. Je vous conseillerais d'y jeter un oeil :)

0
amaatouq