web-dev-qa-db-ja.com

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

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

次の点に関する詳細または参照がありますか?

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

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

81
kiriloff

Picklingは、pythonオブジェクト(リスト、辞書など)を文字ストリームに変換する方法です。この文字ストリームには、別のオブジェクトを再構築するために必要なすべての情報が含まれます= 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)

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

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

About.comには、Pickling here の紹介があります。

93
austin1howard

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

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

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

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

34
Mike McKerns

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

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

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

0
Chicken Max