Alternatives à la conservation de grandes listes en mémoire (python)
Si j'ai une liste(ou un tableau, dictionnaire....) en python qui dépasse la mémoire disponible de l'espace d'adresse, (32 bits python) quelles sont les options et vitesses relatives? (autres que de ne pas faire une liste que les grands)
La liste pourrait dépasser la mémoire, mais je n'ai aucun moyen de savoir avant de la main. Une fois qu'il commence supérieures à 75%, je voudrais ne plus garder la liste dans la mémoire (ou les nouveaux éléments de toute façon), est-il un moyen de convertir un fichier de base de l'approche de la mi-stream?
Quels sont les meilleurs (vitesse et de sortie de fichier options de stockage?
Juste besoin de stocker une simple liste de nombres. pas besoin d'aléatoire Nième élément d'accès, juste à ajouter/pop type d'opérations.
source d'informationauteur Vincent | 2010-01-01
Vous devez vous connecter pour publier un commentaire.
Si vos "chiffres" sont simples suffisant (signés ou non des entiers de 4 octets chacun, ou de flotteurs de 4 ou 8 octets chacun), je recommande la bibliothèque standard tableau module comme le meilleur moyen de garder quelques millions d'entre eux dans la mémoire (le "conseil" de votre "virtual array") avec un fichier binaire (ouvert pour le binaire R/W) sauvegarde le reste de la structure sur le disque.
array.array
a très vitefromfile
ettofile
méthodes pour faciliter le déplacement de données d'avant en arrière.I. e., fondamentalement, en supposant par exemple unsigned long de numéros, quelque chose comme:
Bien sûr, vous pouvez ajouter d'autres méthodes que nécessaire (par exemple, de garder trace de l'ensemble de la longueur, ajouter
extend
peu importe), mais sipop
etappend
sont en effet tous vous avez besoin, cela devrait servir.Il y a probablement des dizaines de façons de stocker vos données de la liste dans un fichier plutôt que dans la mémoire. Comment vous choisissez de le faire dépendra entièrement sur ce genre d'opérations que vous devez effectuer sur les données. Avez-vous besoin d'un accès aléatoire à la n-ième élément? Avez-vous besoin pour itérer sur tous les éléments? Allez-vous être à la recherche pour les éléments qui correspondent à certains critères? Quel formulaire dois les éléments de la liste? Vous ne l'insertion, à la fin de la liste, ou aussi dans le milieu? Est-il des métadonnées, vous pouvez garder en mémoire l'essentiel des éléments sur le disque? Et ainsi de suite et ainsi de suite.
Une possibilité est de structurer vos données relationnelle, et de les stocker dans une base de données SQLite.
La réponse est "ça dépend".
De quoi êtes-vous le stockage dans les listes? Les chaînes? entiers? Objets?
À quelle fréquence est la liste écrit à la comparaison avec le fait d'être lu? Sont seulement les éléments ajoutés à la fin, ou peut entrées d'être modifiées ou inséré dans le milieu?
Si vous êtes seulement en ajoutant à la fin et puis l'écriture dans un fichier plat, peut-être la chose la plus simple qui pourrait éventuellement travailler.
Si vous stockez des objets de taille variable tels que des chaînes, alors peut-être garder un index en mémoire le début de chaque chaîne, de sorte que vous pouvez le lire rapidement.
Si vous souhaitez dictionnaire comportement ensuite, regardez la db modules - dbm, gdbm, bsddb, etc.
Si vous voulez un accès aléatoire écrit alors peut-être une base de données SQL peut-être mieux.
Quoi que vous fassiez, en allant sur le disque va être des ordres de grandeur inférieure à celle en mémoire, mais sans savoir comment les données vont être utilisés, il est impossible d'être plus précis.
edit:
À partir de vos exigences de mises à jour, j'irais avec un fichier plat et garder un tampon en mémoire de la dernière de N éléments.
Bien, si vous êtes à la recherche de vitesse et de vos données numériques dans la nature, vous pourriez envisager d'utiliser numpy et PyTables ou h5py. À partir de ce que je me souviens, l'interface n'est pas aussi beau que de simples listes, mais l'évolutivité est fantastique!!!!
Avez-vous vérifier étagère module python qui est basé sur pickle?
http://docs.python.org/library/shelve.html
Vous pourriez envisager un autre type de structure: pas une liste, mais pour comprendre comment faire (votre tâche) avec un générateur ou une coutume itérateur.
Les systèmes d'exploitation modernes va gérer cela pour vous, sans que vous ayez à vous en préoccuper. Il est appelé la mémoire virtuelle.
Ce sujet un document de base de données orientée?
Il existe plusieurs alternatives; je pense que le plus connu actuellement est CouchDB, mais vous pouvez aussi aller pour Tokyo Cabinet, ou MongoDB. Le dernier a l'avantage de liaisons python directement à partir de l'objectif principal du projet, sans qu'un module supplémentaire.
Vous pouvez essayer blist:
https://pypi.python.org/pypi/blist/