web-dev-qa-db-fra.com

Python sérialisation - Pourquoi le cornichon?

J'ai compris que Python pickling est un moyen de 'stocker' un Python objet d'une manière qui respecte la programmation d'objets - différent d'une sortie écrite en fichier txt ou DB.

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 la représentation des objets plus que, disons, le stockage dans DB?
  • puis-je récupérer des objets marinés d'une Python Shell à 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 suis à la recherche d'un document sur le décapage - Python.doc explique comment implémenter le cornichon mais ne semble pas plonger dans les détails sur l'utilisation et la nécessité de la sérialisation.

81
kiriloff

Le décapage est un moyen de convertir un python objet (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 = python.

Quant à l'endroit où les informations marinées sont stockées, on ferait généralement:

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

Cela stockerait la version marinée de notre var dict dans le fichier 'nom de fichier'. Ensuite, dans un autre script, vous pourriez charger à partir de ce fichier dans une variable et le dictionnaire serait recréé:

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

Une autre utilisation pour le décapage est si vous devez transmettre ce dictionnaire sur un réseau (peut-être avec des sockets ou quelque chose.) Vous devez d'abord le convertir en un flux de caractères, puis vous pouvez l'envoyer via une connexion socket.

De plus, il n'y a pas de "compression" à proprement parler ici ... c'est juste un moyen de convertir d'une représentation (en RAM) à une autre (en "texte").

About.com a une belle introduction au décapage ici .

93
austin1howard

Le décapage est absolument nécessaire pour le calcul distribué et parallèle.

Supposons que vous vouliez effectuer une réduction de carte parallèle avec multiprocessing (ou sur des nœuds de cluster avec pyina ), alors vous devez vous assurer que la fonction que vous souhaitez mapper sur les ressources parallèles décapera. S'il ne décapage pas, vous ne pouvez pas l'envoyer aux autres ressources sur un autre processus, ordinateur, etc. Voir aussi ici pour un bon exemple.

Pour ce faire, j'utilise aneth , qui peut sérialiser presque tout en python. Dill a également quelques bons outils pour vous aider à comprendre ce qui provoque l'échec de votre décapage lorsque votre code échoue.

Et, oui, les gens utilisent la cueillette pour enregistrer l'état d'un calcul, ou votre session ipython , ou autre chose. Vous pouvez également étendre Pickler et UnPickler de pickle pour effectuer la compression avec bz2 ou gzip si vous le souhaitez.

34
Mike McKerns

Je le trouve particulièrement utile avec des classes personnalisées grandes et complexes. 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 au moment de l'exécution par l'utilisateur.

Vous pouvez avoir un autre groupe de tables dans la base de données et écrire une autre fonction pour parcourir tout ce qui est stocké et l'écrire dans les nouvelles tables de base de données. Ensuite, vous devrez écrire une autre fonction pour pouvoir charger quelque chose enregistré en lisant toutes ces informations.

Alternativement, vous pouvez décaper la classe entière telle quelle, puis la stocker dans un seul champ de la base de données. Ensuite, lorsque vous allez le recharger, tout se rechargera à la fois comme il était auparavant. Cela peut finir par économiser beaucoup de temps et de code lors de l'enregistrement et de la récupération de classes compliquées.

0
Chicken Max