9
votes

Usage de RAM variable de Python

Disons qu'il existe une variable dicteuse qui pousse très grandes pendant l'exécution - en millions de clés: paires de valeur.

Cette variable est-elle stockée dans la RAM, en utilisant efficacement toute la mémoire disponible et ralentissez le reste du système?

Demander à l'interprète d'afficher tout le dict est une mauvaise idée, mais cela irait bien tant que une touche est accessible à la fois?


1 commentaires

Vous feriez mieux de considérer les itérables et les générateurs si vous pensez avoir besoin d'énorme bélier


4 Réponses :


4
votes

Oui, un python dict est stocké en RAM. Quelques millions de clés ne sont toutefois pas un problème pour les ordinateurs modernes. Si vous avez besoin de plus en plus de données et de RAM est à court, envisagez d'utiliser une vraie base de données. Les options incluent une DB relationnelle comme SQLite (intégrée à Python, en passant) ou une valeur de valeur de clé comme Redis.

Il a peu de sens affichant des millions d'articles dans l'interprète, mais l'accès à un seul élément doit encore être très efficace.


0 commentaires

2
votes

Pour tout ce que je sais, Python utilise les meilleurs algorithmes de hachage afin que vous alliez probablement obtenir la meilleure efficacité et la meilleure performance de la mémoire. Maintenant, si tout ce qui est conservé dans la RAM ou que vous avez engagé dans un fichier de swap appartient à votre système d'exploitation et dépend de la quantité de RAM que vous avez. Ce que je dirais, c'est mieux si pour l'essayer:

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


5 commentaires

La Comp suis bloquée avec à l'heure actuelle dispose de 512 Mo de RAM, raison pour laquelle je suis concerné. Cependant, la plupart des clés que je vais avoir est d'environ 10k, alors je ne pense pas que cela devrait être un problème. Merci pour le test, bien que je n'essaye pas cela sur celui-ci.


La plupart des OSES sont assez intelligents à propos de la gestion de la mémoire et du swap. Vous devez vraiment bien être bien avec un dictionnaire de n'importe quelle taille tant que vous avez l'espace disque dur pour le fichier de swap.


Je suppose qu'il y a un facteur aléatoire manquant de cet extrait - éventuellement la clé de dictionnaire?


bien chaque clé est équivalente à la valeur stockée- mais cela fonctionne toujours


@Kylotan, @PPTIM: Remarques légitimes. dict ((i, -i) pour i en xrange (10 7)) est d'environ 440 Mo. Si vous faites les valeurs non seulement uniques mais flotte, vous obtenez jusqu'à 480 Mo: dict ((i, flotteur (i) / 10 7) pour I dans Xrange (10 ** 7)). Les deux sont toujours rien de mémoire virtuelle ne peut pas gérer.



5
votes

La principale préoccupation avec les millions d'articles n'est pas le dictionnaire lui-même tant que la quantité d'espace que chacun de ces articles prend. Néanmoins, sauf si vous faites quelque chose de bizarre, ils devraient probablement s'adapter.

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

  1. Déterminez la structure de données que vous devriez réellement utiliser, car une seule dict n'est probablement pas la bonne réponse. Exactement ce que cela dépend de ce que vous faites.

  2. Utilisez une base de données. Votre python devrait venir avec un module SQLite3, c'est donc un démarrage.


0 commentaires

10
votes

Oui, la dicte sera stockée dans la mémoire de processus. Donc, si cela devient assez grand qu'il n'ya pas assez de place dans la RAM du système, vous pouvez vous attendre à ce que le système commence à effectuer un ralentissement massif car le système commence à échanger la mémoire vers et à partir de disque.

D'autres ont déclaré que quelques millions d'articles ne devraient pas poser un problème; Je ne suis pas si sûr. La tête de dicte elle-même (avant de compter la mémoire prise par les clés et valeurs) est significative. Pour Python 2.6 ou plus tard, sys.getsizeof donne quelques informations utiles à propos de la quantité de RAM Diverses structures Python prennent. Quelques résultats rapides, de Python 2.6 sur une machine X à 64 bits X: P>

>>> 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


3 commentaires

Merci, appris sur Getsize of Ceci. Pratiquement, je ne traiterai que de 15 000 valeurs au plus, et la vitesse est de l'essours. J'utilise un dict simplement parce que je n'ai pas touché des bases de données, mais je suppose une DB qui lit et écrit d'un disque dur serait plus lent que la lecture / l'écriture à un dict?


D'accord, pour une dicte cette taille, vous ne devriez pas avoir de problèmes. Quels sont les types des clés et des valeurs? Cordes?


principalement des flotteurs, des cordes, quelques listes