Question

Dire qu'il ya une variable dict qui pousse très grand lors de l'exécution - jusqu'à en millions de couples clé: valeur.

Est-ce que cette variable sont stockés dans la RAM, en utilisant efficacement toute la mémoire disponible et ralentir le reste du système?

Demander l'interprète pour afficher l'ensemble dict est une mauvaise idée, mais serait-il bien aussi longtemps que une clé est accessible à la fois?

Était-ce utile?

La solution

Oui, le dict sera stocké dans la mémoire du processus. Donc, si cela devient assez grand qu'il n'y a pas assez de place dans la mémoire vive du système, alors vous pouvez vous attendre à voir ralentissement massif que le système commence à échanger la mémoire et du disque.

D'autres ont dit que quelques millions d'articles ne devrait pas poser un problème; Je ne suis pas si sûr. Les frais généraux dict lui-même (avant la dimension mémoire utilisée par les clés et valeurs) est importante. Pour Python 2.6 ou version ultérieure, sys.getsizeof donne des informations utiles combien RAM différentes structures Python prennent. Quelques résultats rapides, de Python 2.6 sur une machine OS X 64 bits:

>>> from sys import getsizeof
>>> getsizeof(dict((n, 0) for n in range(5462)))/5462.
144.03368729403149
>>> getsizeof(dict((n, 0) for n in range(5461)))/5461.
36.053470060428495

Ainsi, le dict varie frais généraux entre 36 octets par élément et 144 octets par élément sur cette machine (la valeur exacte en fonction du remplissage est table de hachage interne du dictionnaire; ici 5461 = 2 ** 14 // 3 est l'un des où les seuils de la table de hachage interne est agrandie). Et ce, avant d'ajouter les frais généraux pour les articles dict eux-mêmes; si elles sont toutes les chaînes courtes (6 caractères ou moins, par exemple), puis qui ajoute encore un autre> = 80 octets par élément (peut-être moins si plusieurs clés partagent la même valeur).

Alors il ne faudrait pas que plusieurs millions d'articles de dict à RAM échappement sur une machine typique.

Autres conseils

La principale préoccupation des millions d'articles n'est pas le dictionnaire lui-même tant que la quantité d'espace chacun de ces éléments reprend. Pourtant, à moins que vous faites quelque chose de bizarre, ils devraient probablement s'adapter.

Si vous avez un dict avec des millions de clés, cependant, que vous faites probablement quelque chose de mal. Vous devriez faire un ou les deux:

  1. Pensez à ce que la structure de données, vous devriez effectivement être à l'aide, parce qu'un seul dict est probablement pas la bonne réponse. Exactement ce que ce serait dépend de ce que vous faites.

  2. Utiliser une base de données. Votre Python devrait venir avec un module de sqlite3, de sorte que c'est un début.

Oui, un dict Python est stocké dans la mémoire vive. Cependant quelques millions de clés ne sont pas un problème pour les ordinateurs modernes,. Si vous avez besoin de plus en plus de données et la RAM est en cours d'exécution sur, envisagez d'utiliser une base de données réelle. Les options incluent un DB relationnelle comme SQLite (intégré en Python, en passant) ou un magasin de valeur clé comme Redis.

Il fait peu de sens afficher des millions d'articles dans l'interpréteur, mais l'accès à un seul élément devrait être encore très efficace.

Pour tout ce que je sais Python utilise les meilleurs algorithmes de hachage de sorte que vous allez probablement obtenir la meilleure efficacité possible de la mémoire et de performance. Maintenant, si la chose est conservée dans la mémoire vive ou engagée dans un fichier d'échange est à votre système d'exploitation et dépend de la quantité de RAM que vous avez. Ce que je dirais est préférable de simplement essayer:

from random import randint
a = {}
for i in xrange(10*10**6):
    a[i] = i

Comment cette recherche lorsque vous l'exécutez? Cela prend environ 350Mb sur mon système qui devrait être gérable pour le moins.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top