J'ai regardé la documentation de pickle , mais je ne comprends pas où pickle est utile.
Quels sont les cas d'utilisation courants du cornichon?
J'ai regardé la documentation de pickle , mais je ne comprends pas où pickle est utile.
Quels sont les cas d'utilisation courants du cornichon?
Réponses:
Quelques utilisations que j'ai rencontrées:
1) sauvegarde des données d'état d'un programme sur le disque afin qu'il puisse continuer là où il s'était arrêté lors du redémarrage (persistance)
2) envoi de données python via une connexion TCP dans un système multicœur ou distribué (marshalling)
3) Stocker des objets Python dans une base de données
4) convertir un objet Python arbitraire en une chaîne afin qu'il puisse être utilisé comme clé de dictionnaire (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 des chaînes différentes - ou même le même objet mariné deux fois peut avoir des représentations différentes. En effet, le cornichon peut inclure des informations sur le nombre de références.
Pour souligner le commentaire de @ lunaryorn - vous ne devez jamais décoller une chaîne d'une source non fiable, car un pickle soigneusement conçu pourrait exécuter du code arbitraire sur votre système. Par exemple, voir https://blog.nelhage.com/2011/03/exploiting-pickle/
Exemple aller-retour minimal.
>>> import pickle
>>> a = Anon()
>>> a.foo = 'bar'
>>> pickled = pickle.dumps(a)
>>> unpickled = pickle.loads(pickled)
>>> unpickled.foo
'bar'
Edit: mais en ce qui concerne la question des exemples concrets de décapage, l' utilisation la plus avancée du décapage (vous devrez peut-être creuser assez profondément dans la source) est ZODB: http://svn.zope.org/
Sinon, PyPI en mentionne plusieurs: http://pypi.python.org/pypi?:action=search&term=pickle&submit=search
J'ai personnellement vu plusieurs exemples d'objets marinés envoyés sur le réseau en tant que protocole de transfert réseau facile à utiliser.
Le décapage est absolument nécessaire pour le calcul distribué et parallèle.
Supposons que vous vouliez effectuer une réduction de mappage parallèle avec multiprocessing
(ou entre les nœuds de cluster avec pyina ), vous devez vous assurer que la fonction que vous souhaitez mapper sur les ressources parallèles sera pickle. S'il ne se décolore pas, vous ne pouvez pas l'envoyer aux autres ressources sur un autre processus, ordinateur, etc. Voir également ici pour un bon exemple.
Pour ce faire, j'utilise l' aneth , qui peut sérialiser presque tout en python. Dill dispose également de bons outils pour vous aider à comprendre ce qui cause l'échec de votre décapage lorsque votre code échoue.
Et, oui, les gens utilisent le picking pour enregistrer l'état d'un calcul, ou votre session ipython , ou autre.
Je l'ai utilisé dans l'un de mes projets. Si l'application était arrêtée pendant son fonctionnement (elle effectuait une longue tâche et traitait beaucoup de données), je devais enregistrer toute la structure de données et la recharger après la réexécution de l'application. J'ai utilisé cPickle pour cela, car la vitesse était une chose cruciale et la taille des données était vraiment grande.
Pickle est comme "Enregistrer sous .." et "Ouvrir .." pour vos structures de données et vos classes. Disons que je veux sauvegarder mes structures de données afin qu'elles soient persistantes entre les exécutions du programme.
Économie:
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 reconstruire myStuff à partir de zéro, et je peux simplement reprendre là où je me suis arrêté.
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 la documentation implique 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 ses cas d'utilisation courants. Des explications générales sur la sérialisation sans tenir compte d'un langage de programmation particulier peuvent également aider: https://stackoverflow.com/a/14482962/4383472 , Qu'est-ce que la sérialisation? , https://stackoverflow.com/a/3984483/4383472
Je peux vous dire les utilisations pour lesquelles je l'utilise et je l'ai vu utilisé pour:
Ce sont ceux pour lesquels je l'utilise au moins
J'utilise le décapage lors de la mise au rebut d'un site Web à ce moment-là, je souhaite stocker plus de 8000k URL et je souhaite les traiter le plus rapidement possible.J'utilise donc le décapage car sa qualité de sortie est très élevée.
vous pouvez facilement accéder à l'URL et où vous arrêtez même le mot clé du répertoire de travail, récupérez également les détails de l'url très rapidement pour reprendre le processus.