Quelle est la taille maximale d'un tableau numpy?
Je suis en train de créer une matrice contenant 2 708 000 000 éléments. Lorsque j'essaie de créer un tableau numpy de cette taille, il me donne une erreur de valeur. Est-il possible que je peux augmenter la taille maximale de la matrice?
a=np.arange(2708000000)
ValueError Traceback (most recent call last)
ValueError: taille Maximale autorisée dépassée
La taille est en fait plate-forme d'exécution et de charge: mail.scipy.org/pipermail/numpy-discussion/2011-January/... Dans mon plattform, la limite se situe quelque part entre 1.15 et 1.16e18.
OriginalL'auteur branwen85 | 2013-01-25
Vous devez vous connecter pour publier un commentaire.
Vous êtes en train de créer un tableau avec 2,7 milliards de dollars d'entrées. Si vous êtes en cours d'exécution 64 bits numpy, à 8 octets par entrée, qui serait de 20 GO en tout.
Donc presque certainement vous manqué de la mémoire sur votre ordinateur. Il n'y a pas de taille maximale de la matrice dans numpy.
np.intp
type de données. Qui pour les versions 32 bits ne peut être 32bits... bien sûr qui sera en corrélation pour presque toutes fins pratiques avec de la mémoire...Cet exemple a effectivement été causé par un problème de mémoire. Cependant, je lance mon analyse sur une très grande capacité de mémoire de la machine et je continue à recevoir des erreurs... je vais créer une nouvelle question avec le travail réel problème.
Si vous essayez de créer un tableau de 1e30 éléments, il déclenche une erreur avant même de tenter d'allouer de la mémoire. Si vous essayez d'affecter de nombreux petits tableaux jusqu'à ce qu'il n'y a pas d'espace à gauche, ensuite, vous recevez un MemoryError.
OriginalL'auteur shoyer
Un ValueError indique la taille est trop grande pour la répartition, il n'y a pas assez de mémoire. Sur mon portable, en utilisant 64bits python, je peut l'affecter, si je réduis le nombre de bits:
Dans votre cas, arange utilise
int64
bits, ce qui signifie qu'il est 16 fois plus, ou autour de 43 GO. un 32 bits du processus d'accès autour de 4 GO de mémoire.La raison sous-jacente est la taille des pointeurs pour accéder à des données et combien de nombres vous pouvez représenter avec ces bits:
Remarque que je peux reproduire votre ValueError si je tente de créer un univers grand tableau:
Si votre machine dispose de beaucoup de mémoire, comme vous l'avez dit, il sera 64 bits, vous devez installer Python 64 bits pour pouvoir y accéder. D'autre part, pour ces grands ensembles de données, vous devriez envisager la possibilité de l'utilisation de base des calculs.
OriginalL'auteur Davidmh
J'ai été capable de créer un tableau avec une taille de 6Billion qui a mangé de 45 go de mémoire. Par défaut, numpy créé le tableau avec une dtype de float64. En supprimant la précision, j'ai été en mesure de sauver beaucoup de mémoire.
par défaut == float64
np.float64 -- 45.7 GO
np.float32 -- de 22,9 GO
np.int8 -- 5.7 GO
Évidemment un 8bit entier ne le stocker une valeur de 6B. Je suis sûr qu'un max taille existe à un certain point, mais je soupçonne que c'est passé quelque chose de possible en 2016. Il est intéressant de noter, "Python Blaze" vous permet de créer des tableaux numpy sur le disque. Je me souviens de jouer avec elle il y a quelques temps et la création d'une très grande tableau qui a eu jusqu'à 1 to de disque.
il a été un long temps depuis que j'ai foiré avec cette. Sur le brasier docs (blaze.readthedocs.io/en/latest/index.html) il y a une référence à "dask.tableau" (dask.org) qui a un exemple de code sur la page principale. 2 lignes de code, y compris l'importation, vous obtiendrez un exemple pour commencer.
OriginalL'auteur 16num
Il est en effet liée à la valeur maximale du système de l'adresse de longueur, pour le dire simplement, système 32 bits ou 64 bits du système. Voici une explication pour ces questions, à l'origine de Mark Dickinson
Réponse courte: le Python objet de frais généraux est de vous tuer. En Python 2.x sur une machine 64 bits, d'une liste de chaînes consomme 48 octets par entrée de liste de même avant de prendre en compte le contenu des chaînes. C'est plus de 8,7 Go de surcharge pour la taille du tableau que vous décrivez. Sur une machine 32 bits ça va être un peu mieux: seulement 28 octets par entrée de la liste.
Une longue explication: vous devez être conscient que Python objets eux-mêmes peuvent être assez volumineux: même des objets simples comme des entiers, des flotteurs et des cordes. Dans votre code, vous êtes de se retrouver avec une liste de listes de chaînes. Sur mon (64-bit) de la machine, même une chaîne vide d'objet prend 40 octets, et que vous avez besoin d'ajouter 8 octets pour la liste de pointeur qui pointe vers cette chaîne de l'objet en mémoire. Donc, c'est déjà 48 octets par entrée, ou environ 8.7 Go. Étant donné que Python alloue de la mémoire, en multiple de 8 octets à la fois, et que vos chaînes sont presque certainement non-vide, vous êtes en fait en regardant 56 ou 64 octets (je ne sais pas combien de temps vos chaînes sont par participation.
Solutions possibles:
(1) que Vous pourriez faire (un peu) mieux par la conversion de vos entrées de chaînes à ints ou de flotteurs appropriées.
(2) Vous feriez beaucoup mieux en utilisant Python de type tableau (pas la même que la liste!) ou par l'utilisation de numpy: votre ints ou les flotteurs ne prendra que 4 ou 8 octets chacun.
Depuis la version 2.6 de Python, vous pouvez obtenir des renseignements de base au sujet de l'objet tailles avec le sys.getsizeof fonction. Notez que si vous l'appliquez à une liste (ou autre récipient) puis le retour de la taille ne prend pas en compte la taille de la liste des objets; seulement de la structure utilisée pour contenir ces objets. Voici quelques valeurs sur ma machine.
Oui,mais c'est aussi un problème de la limitation de la taille, de l'organiser est de générer un tableau, et le sens du problème est qu'il dépasse la limite de taille de l'élément.
OriginalL'auteur KarlFG