Dupe plus spécifique de 875228 - Stockage simple de données en Python .
J'ai un dict assez volumineux (6 Go) et je dois faire quelques traitements dessus. J'essaie plusieurs méthodes de regroupement de documents, je dois donc tout garder en mémoire en même temps. J'ai d'autres fonctions à exécuter sur ces données, mais le contenu ne changera pas.
Actuellement, chaque fois que je pense à de nouvelles fonctions, je dois les écrire, puis générer à nouveau le dict. Je cherche un moyen d'écrire ce dict dans un fichier, afin de pouvoir le charger en mémoire au lieu de recalculer toutes ses valeurs.
pour simplifier à l'extrême, cela ressemble à quelque chose comme: {((('Word', 'liste'), (1,2), (1,3)), (...)): 0.0, ....}
Je pense que le python doit avoir un meilleur moyen que moi de parcourir une chaîne à la recherche de: and (essayer de l’analyser dans un dictionnaire.
Pourquoi ne pas utiliser python pickle ? Python possède un excellent module de sérialisation appelé pickle, très facile à utiliser.
import cPickle
cPickle.dump(obj, open('save.p', 'wb'))
obj = cPickle.load(open('save.p', 'rb'))
Pickle présente deux inconvénients:
Si vous utilisez Python 2.6, il existe un module intégré appelé json . C'est aussi simple que pickle à utiliser:
import json
encoded = json.dumps(obj)
obj = json.loads(encoded)
Le format Json est lisible par l’homme et ressemble beaucoup à la représentation de chaîne de dictionnaire en python. Et n'a pas de problèmes de sécurité comme cornichon. Mais pourrait être plus lent que cPickle.
J'utiliserais shelve
, json
, yaml
ou autre, comme suggéré par d'autres réponses.
shelve
est spécialement cool parce que vous pouvez avoir dict
sur le disque et l'utiliser quand même. Les valeurs seront chargées à la demande.
Mais si vous voulez vraiment analyser le texte de dict
et qu'il ne contient que str
ings, int
s et Tuple
s comme vous l'avez montré, vous pouvez utiliser ast.literal_eval
pour les analyser. C'est beaucoup plus sûr, car vous ne pouvez pas évaluer les expressions complètes avec cela. Cela ne fonctionne qu'avec str
ings, numbers, Tuple
s, list
s, dict
s, bool
eans et None
:
>>> import ast
>>> print ast.literal_eval("{12: 'mydict', 14: (1, 2, 3)}")
{12: 'mydict', 14: (1, 2, 3)}
Je suggérerais que vous utilisiez YAML pour votre format de fichier afin que vous puissiez le bricoler sur le disque.
How does it look:
- It is indent based
- It can represent dictionaries and lists
- It is easy for humans to understand
An example: This block of code is an example of YAML (a dict holding a list and a string)
Full syntax: http://www.yaml.org/refcard.html
Pour l'obtenir en python, il suffit d'utiliser easy_install pyyaml. Voir http://pyyaml.org/
Il est livré avec des fonctions simples de sauvegarde/chargement de fichiers, dont je ne me souviens plus tout de suite.
Voici quelques alternatives en fonction de vos besoins:
numpy
stocke vos données brutes dans un format compact et effectue correctement les opérations de groupe/de masse
shelve
est comme un grand dict sauvegardé par un fichier
un module de stockage tiers, par exemple stash
, stocke des données ordinaires arbitraires
base de données appropriée, par exemple mongodb pour les données velues ou les données simples mysql ou sqlite et une récupération plus rapide
Cette solution chez SourceForge utilise uniquement les modules Python standard:
module y_serial.py :: entrepôt d'objets Python avec SQLite
"Sérialisation + persistance :: dans quelques lignes de code, compressez et annotez les objets Python dans SQLite; puis récupérez-les plus tard chronologiquement par mots-clés sans SQL. Module" standard "le plus utile pour qu'une base de données puisse stocker des données sans schéma."
http://yserial.sourceforge.net
Le bonus à la compression réduira probablement votre dictionnaire de 6 Go à 1 Go. Si vous ne souhaitez pas stocker une série de dictionnaires dans le magasin, le module contient également une solution file.gz qui pourrait être plus appropriée compte tenu de la taille de votre dictionnaire.
Ecrivez-le dans un format sérialisé, tel que pickle (un module de bibliothèque standard python pour la sérialisation) ou peut-être en utilisant JSON (une représentation pouvant être évaluée pour produire à nouveau la représentation en mémoire).