2012-01-23 8 views
63

私はPython picklingが、Objectプログラミングを尊重する方法でPython Objectを「格納」する方法であることを理解しました。これは、txtファイルまたはDBで書かれた出力とは異なります。オブジェクトを漬けているPythonシリアル化 - なぜpickleですか?

  • は「保存された」:

    あなたは、以下の点についての詳細や参照を持っていますか?
  • なぜオブジェクトの表現を保存するよりも、ピーリングがDBに保存されているのですか?
  • Pythonシェルセッションから別のPythonシェルセッションにpickledオブジェクトを取得できますか?
  • シリアル化が有用な場合、重要な例がありますか?
  • pickleを使用したシリアル化では、データ '圧縮'を意味しますか?

つまり、私はpicklingに関する文書を探しています - Python.docはpickleを実装する方法について説明していますが、直列化の使用法と必要性について詳しくは説明していません。

+0

後で復元するための状態を保存したり、オブジェクトを別のPythonランタイムに共有/コピーしたりするのは私の推測です。 – synthesizerpatel

+12

あなたの質問の多くは、Wikipediaのシリアル化に関する記事で回答しています。http://en.wikipedia.org/wiki/Serialization – NPE

+5

Pythonでシリアル化するためにピクルが必要なのか_求めていますか? )結局のところシリアル化?_。 – moooeeeep

答えて

78

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

漬けの情報が格納されている場所については、通常、1つは何でしょう:「ファイル名」ファイルに私たちのvar辞書の漬けバージョンを格納します

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

。その後、別のスクリプトでは、変数にこのファイルから読み込むことができますし、辞書が再作成されます:

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

あなたはおそらくソケットとネットワーク(または何かの上にこの辞書を送信する必要がある場合は、酸洗の別の用途があります最初に文字ストリームに変換してから、ソケット接続で送ることができます。

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

については、酸洗の素晴らしい紹介がありますhere

+2

通常、 'open( 'filename')を使ってf:...とします。 – moooeeeep

+0

ah yes ...これはもっとエラーに耐えます。ありがとう。 – austin1howard

+3

また、 'open(filename、 'wb')でf:...'を実行する必要があるか、ファイルに書き込めません。 –

29

分散処理と並列処理には、酸洗処理が絶対に必要です。

multiprocessing(またはpyinaのクラスタノードを経由して)パラレルマップ削減を実行する場合は、並列リソースにマップしたい機能が選択されていることを確認する必要があります。ピクルが発生しない場合は、別のプロセス、コンピュータなどの他のリソースに送ることはできません。また、良い例についてはhereを参照してください。

これを行うには、dillを使用します。これは、ほとんどすべてのPythonをシリアル化できます。 Dillにはsome good toolsがあり、コードが失敗したときに酸洗が失敗する原因を理解するのに役立ちます。

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

関連する問題