Utilisation commune-cas pour pickle en Python
9 réponses
quelques utilisations que j'ai rencontrées:
1) sauvegarder les données d'état d'un programme sur le disque pour qu'il puisse continuer là où il s'est arrêté lors du redémarrage (persistance)
2) envoi de données python via une connexion TCP dans un système multi-core ou distribué (marshalling)
3) stocker des objets python dans une base de données
4) conversion d'un objet Python arbitraire en chaîne de façon à ce qu'il puisse être utilisé comme un dictionnaire clé (par exemple pour la mise en cache et la mémorisation).
il y a quelques problèmes avec le dernier - deux objets identiques peuvent être décapés et donner lieu à des chaînes différentes - ou même le même objet décapé deux fois peut avoir des représentations différentes. C'est parce que le cornichon peut inclure une référence informations de comptage.
pour souligner le commentaire de @lunaryorn - vous ne devriez jamais débickle une corde d'une source non fiable, car un cornichon soigneusement conçu pourrait exécuter du code arbitraire sur votre système. Par exemple voir https://blog.nelhage.com/2011/03/exploiting-pickle /
minimum roundtrip example..
>>> import pickle
>>> a = Anon()
>>> a.foo = 'bar'
>>> pickled = pickle.dumps(a)
>>> unpickled = pickle.loads(pickled)
>>> unpickled.foo
'bar'
Edit: mais quant à la question des exemples réels de décapage, peut-être le l'utilisation la plus avancée de décapage (vous auriez à creuser assez profondément dans la source) est ZODB: http://svn.zope.org /
sinon, PyPI mentionne plusieurs: http://pypi.python.org/pypi?:action=search&term=pickle&submit=search
j'ai personnellement vu plusieurs exemples d'objets décapés envoyés sur le réseau comme un protocole de transfert de réseau facile à utiliser.
je l'ai utilisé dans un de mes projets. Si l'application a été arrêtée pendant son fonctionnement (il a fait une tâche longue et a traité beaucoup de données), je devais sauvegarder la structure de données entière et recharger après que l'application a été lancée à nouveau. J'ai utilisé cPickle pour cela, car la vitesse était une chose cruciale et la taille des données était vraiment grande.
est absolument nécessaire pour le calcul distribué et parallèle.
dire que vous vouliez faire une carte parallèle-réduire avec multiprocessing
(ou à travers les noeuds cluster avec pyina ), alors vous devez vous assurer que la fonction que vous voulez avoir mappé à travers les ressources parallèles sera pickle. S'il ne s'active pas, vous ne pouvez pas l'envoyer aux autres ressources sur un autre processus, ordinateur, etc. Voir aussi ici pour une bonne exemple.
pour ce faire, j'utilise dill , qui peut sérialiser presque tout en python. Dill a aussi quelques bons outils pour vous aider à comprendre ce qui cause l'échec de votre décapage lorsque votre code échoue.
et, oui, les gens utilisent la cueillette pour sauver l'état d'un calcul, ou votre ipython session, ou autre.
pour le débutant (comme c'est le cas avec moi) il est vraiment difficile de comprendre pourquoi utiliser pickle en premier lieu lors de la lecture de la documentation officielle . C'est peut-être parce que les docs impliquent que vous connaissez déjà tout le but de la sérialisation. Ce n'est qu'après avoir lu la description générale de la sérialisation que j'ai compris la raison de ce module et de ses cas d'usage courant. Aussi grandes explications de la sérialisation d'écarter une langage de programmation particulier peut aider: https://stackoverflow.com/a/14482962/4383472 , Qu'est-ce que la sérialisation? , https://stackoverflow.com/a/3984483/4383472
je peux vous dire que je l'utiliser et d'avoir vu utilisé pour:
- profil de Jeu sauve
- Jeu de données enregistre comme la vie et la santé
- enregistrements antérieurs de numéros say entrés dans un programme
ce sont ceux que je l'utilise pour au moins
j'utilise le décapage lors de la mise au rebut d'un site web à ce moment-là je veux stocker plus de 8000K urls et je veux les traiter aussi vite que possible donc j'utilise le décapage parce que sa qualité de sortie est très élevé.
vous pouvez facilement atteindre à l'url et où vous arrêtez même le mot clé de répertoire de travail aussi chercher des détails d'url très rapide pour reprendre le processus.
Cornichon "Enregistrer sous.."et "Ouvrir.."pour vos structures de données et vos classes. Disons que je veux sauver mes structures de données pour qu'elles soient persistantes entre les passages de programme.
Save:
with open("save.p", "wb") as f:
pickle.dump(myStuff, f)
Chargement:
try:
with open("save.p", "rb") as f:
myStuff = pickle.load(f)
except:
myStuff = defaultdict(dict)
maintenant, je n'ai plus besoin de refaire mes pieds à partir de zéro, et je peux juste reprendre(le) là où je me suis arrêté.