Pythonのシリアル化-なぜpickleするのですか?


87

Pythonのpickle化は、オブジェクトプログラミングを尊重する方法でPythonオブジェクトを「保存」する方法であることを理解しました。これは、txtファイルやDBで記述された出力とは異なります。

次の点について、詳細や参考資料はありますか。

  • 漬け物はどこに「保管」されますか?
  • ピクルス化は、たとえばDBに格納するよりも、オブジェクト表現を保持するのはなぜですか?
  • あるPythonシェルセッションから別のセッションにpickle化されたオブジェクトを取得できますか?
  • シリアル化が役立つ重要な例はありますか?
  • pickleを使用したシリアル化は、データの「圧縮」を意味しますか?

言い換えれば、私はピクルスに関するドキュメントを探しています-Python.docはピクルスを実装する方法を説明していますが、シリアル化の使用と必要性についての詳細には飛び込んでいないようです。


後で復元するために状態を保存するか、オブジェクトを別のpythonランタイムに共有/コピーするのが私の推測です。
シンセサイザー

13
あなたの質問の多くは、シリアル化に関するウィキペディアの記事によって答えられます:en.wikipedia.org/wiki/Serialization
NPE

5
Pythonでのシリアル化にPickleが必要な理由を尋ねていますか?というか、結局のところ、シリアル化(の目的)何ですか?
moooeeeep 2012年

ピクルスのセキュリティ問題について言及するのは良いことかもしれません。例は、ドキュメント、およびこのような多数のSOの質問にあります。
djvg

回答:


99

Picklingは、Pythonオブジェクト(list、dictなど)を文字ストリームに変換する方法です。この文字ストリームには、別のPythonスクリプトでオブジェクトを再構築するために必要なすべての情報が含まれているという考え方です。

漬け物の情報が保存される場所については、通常、次のようにします。

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

これにより、ピクルス化さvarれたdictのバージョンが「filename」ファイルに保存されます。次に、別のスクリプトで、このファイルから変数にロードすると、辞書が再作成されます。

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

ピクルスのもう1つの用途は、この辞書をネットワーク経由で送信する必要がある場合です(おそらく、ソケットなどを使用します)。最初に文字ストリームに変換する必要があり、次にソケット接続経由で送信できます。

また、ここで言う「圧縮」はありません...これは、ある表現(RAM内)から別の表現(「テキスト」内)に変換する方法にすぎません。

About.comにはピクルスの素晴らしい紹介があります


2
通常はそうしますwith open('filename') as f: ...
moooeeeep 2012年

3
また、実行する必要がありwith open(filename, 'wb') as f: ...ます。そうしないと、ファイルに書き込むことができません。
Tim Pietzcker 2012年

ありがとう!Pythonの永続性管理に関するこれは素晴らしいです、ここ
kiriloff 2012年

1
一般にpickle、ネットワークを介して辞書を送信するために使用することはあまり良い考えではありません(jsonはここでより良いかもしれません)。まれに、multiprocessingモジュールなどの便利な場合があります。
jfs 2012年

@Tim Pietzcker:protocol=0(Python2.xのデフォルト)は、テキストモードで開いたファイルで使用できます。
jfs 2012年

36

分散コンピューティングと並列コンピューティングには、酸洗いが絶対に必要です。

並列map-reduceを使用してmultiprocessing(またはpyinaを使用してクラスターノード間で)実行したいとします。次に、並列リソース間でマップしたい関数がピクルスになることを確認する必要があります。酸洗いしないと、別のプロセスやコンピューターなどの他のリソースに送信できません。良い例については、こちらも参照してください。

これを行うために、私はdillを使用します。これは、Pythonでほとんどすべてをシリアル化できます。Dillには、コードが失敗したときにピクルスが失敗する原因を理解するのに役立ついくつかの優れたツールもあります。

そして、はい、人々はピッキングを使用して、計算の状態やipythonセッションなどを保存します。また、pickleのPicklerとUnPicklerを拡張して、bz2必要にgzip応じて圧縮を行うこともできます。


0

大規模で複雑なカスタムクラスで特に役立つことがわかりました。私が考えている特定の例では、クラスを作成するために(データベースから)情報を「収集」することは、すでに半分の戦いでした。次に、クラスに格納されているその情報は、実行時にユーザーによって変更される可能性があります。

データベースに別のテーブルグループを作成し、別の関数を記述して、保存されているすべてのものを調べ、それを新しいデータベーステーブルに書き込むことができます。次に、その情報をすべて読み戻して保存されたものをロードできるように、別の関数を作成する必要があります。

または、クラス全体をそのままピクルスにして、それをデータベースの1つのフィールドに格納することもできます。その後、ロードし直すと、以前と同じようにすべてが一度にロードされます。これにより、複雑なクラスを保存および取得するときに、多くの時間とコードを節約できます。


-1

それは一種のシリアル化です。cPickleを使用すると、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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.