95 votes

Sérialisation Python - Pourquoi pickle ?

J'ai compris que le pickling Python est un moyen de "stocker" un objet Python d'une manière qui respecte la programmation objet - différente d'une sortie écrite dans un fichier txt ou une base de données.

Avez-vous plus de détails ou de références sur les points suivants :

  • où sont "stockés" les objets marinés ?
  • Pourquoi le décapage préserve-t-il davantage la représentation des objets que, par exemple, le stockage dans une base de données ?
  • Puis-je récupérer des objets marqués d'une session shell Python à une autre ?
  • Avez-vous des exemples significatifs où la sérialisation est utile ?
  • la sérialisation avec pickle implique-t-elle une "compression" des données ?

En d'autres termes, je cherche une documentation sur le pickle - Python.doc explique comment mettre en œuvre le pickle mais ne semble pas entrer dans les détails de l'utilisation et de la nécessité de la sérialisation.

0 votes

Je pense qu'il s'agit de sauvegarder un état pour le restaurer ultérieurement ou de partager/copier un objet avec un autre système d'exécution de Python.

14 votes

L'article de Wikipédia sur la sérialisation répond à bon nombre de vos questions : fr.wikipedia.org/wiki/Serialisation

5 votes

Demandez-vous pourquoi aurais-je besoin de Pickle pour la sérialisation en Python ? ou plutôt quel est le but de la sérialisation après tout ? .

103voto

austin1howard Points 1040

Le pickling est un moyen de convertir un objet python (liste, dict, etc.) en un flux de caractères. L'idée est que ce flux de caractères contient toutes les informations nécessaires pour reconstruire l'objet dans un autre script python.

Pour ce qui est de l'endroit où sont stockées les informations décapées, il y en a généralement un qui fait l'affaire :

with open('filename', 'wb') as f:
    var = {1 : 'a' , 2 : 'b'}
    pickle.dump(var, f)

Il s'agirait de stocker la version saumurée de notre var dans le fichier 'filename'. Ensuite, dans un autre script, vous pourriez charger ce fichier dans une variable et le dictionnaire serait recréé :

with open('filename','rb') as f:
    var = pickle.load(f)

Vous devez d'abord le convertir en un flux de caractères, puis vous pouvez l'envoyer par le biais d'une connexion de type socket.

En outre, il n'y a pas de "compression" à proprement parler... il s'agit simplement d'un moyen de convertir une représentation (en RAM) en une autre (en "texte").

About.com propose une belle introduction au saumurage. aquí .

2 votes

Habituellement, un seul ferait l'affaire with open('filename') as f: ...

3 votes

En outre, vous devez effectuer les opérations suivantes with open(filename, 'wb') as f: ... ou vous ne pourriez pas écrire dans le fichier.

0 votes

Merci ! Celui sur la gestion de la persistance en Python est intéressant, aquí

37voto

Mike McKerns Points 965

Le décapage est absolument nécessaire pour l'informatique distribuée et parallèle.

Supposons que vous souhaitiez effectuer un traitement parallèle de type map-reduce avec multiprocessing (ou entre les nœuds du cluster avec pyine ), vous devez vous assurer que la fonction que vous souhaitez mapper à travers les ressources parallèles est capable de se déconnecter. Si ce n'est pas le cas, vous ne pouvez pas l'envoyer aux autres ressources sur un autre processus, ordinateur, etc. Voir aussi aquí pour un bon exemple.

Pour ce faire, j'utilise aneth qui permet de sérialiser à peu près n'importe quoi en python. Dill dispose également de quelques bons outils pour vous aider à comprendre ce qui fait que votre décapage échoue lorsque votre code échoue.

Et, oui, les gens utilisent le picking pour sauvegarder l'état d'un calcul, ou de votre ipython ou autre. Vous pouvez également étendre les fonctions Pickler et UnPickler de pickle pour faire de la compression avec bz2 o gzip si vous le souhaitez.

0voto

Chicken Max Points 19

Je trouve qu'il est particulièrement utile pour les classes personnalisées complexes et de grande taille. Dans un exemple particulier auquel je pense, la "collecte" des informations (à partir d'une base de données) pour créer la classe représentait déjà la moitié de la bataille. Ensuite, ces informations stockées dans la classe peuvent être modifiées par l'utilisateur au moment de l'exécution.

Vous pourriez avoir un autre groupe de tables dans la base de données et écrire une autre fonction pour passer en revue tout ce qui est stocké et l'écrire dans les nouvelles tables de la base de données. Il faudrait ensuite écrire une autre fonction pour pouvoir charger quelque chose de sauvegardé en relisant toutes ces informations.

Il est également possible d'extraire toute la classe telle quelle et de la stocker dans un seul champ de la base de données. Ensuite, lorsque vous la chargerez à nouveau, tout se chargera en une seule fois, comme avant. Cela peut permettre d'économiser beaucoup de temps et de code lors de l'enregistrement et de la récupération de classes complexes.

-1voto

Paritosh Yadav Points 31

C'est une sorte de sérialisation. utilisez cPickle, c'est beaucoup plus rapide que pickle.

import pickle
##make Pickle File
with open('pickles/corups.pickle', 'wb') as handle:
    pickle.dump(corpus, handle)

#read pickle file
with open('pickles/corups.pickle', 'rb') as handle:
    corpus = pickle.load(handle)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X