web-dev-qa-db-ja.com

Pythonでのpickleの一般的なユースケース

pickle のドキュメントを見てきましたが、pickleがどこで役立つのかわかりません。

Pickleの一般的なユースケースは何ですか?

125
satoru

私が遭遇したいくつかの用途:

1)プログラムの状態データをディスクに保存して、再起動時に中断したところから続行できるようにする(永続性)

2)python TCPマルチコアまたは分散システムでの接続(マーシャリング)経由のデータ

3)pythonオブジェクトをデータベースに保存する

4)任意のpythonオブジェクトを文字列に変換し、辞書キーとして使用できるようにします(キャッシュとメモ化など)。

最後の問題にはいくつかの問題があります。2つの同一のオブジェクトをピクルすると、異なる文字列が生成される可能性があります。これは、ピクルに参照カウント情報を含めることができるためです。

@lunaryornのコメントを強調するために、信頼できないソースから文字列のピクルを外さないでください。慎重に作成されたピクルがシステム上で任意のコードを実行する可能性があるためです。たとえば、 https://blog.nelhage.com/2011/03/exploiting-pickle/ を参照してください

55
Dave Kirby

最小限の往復の例..

>>> import pickle
>>> a = Anon()
>>> a.foo = 'bar'
>>> pickled = pickle.dumps(a)
>>> unpickled = pickle.loads(pickled)
>>> unpickled.foo
'bar'

Edit:しかし、ピクルスの実例の問題に関しては、おそらくthe最も高度な使用漬物の(ソースを深く掘り下げる必要があります)ZODB: http://svn.zope.org/

それ以外の場合、PyPIはいくつかのことに言及しています: http://pypi.python.org/pypi?:action=search&term=pickle&submit=search

個人的には、使いやすいネットワーク転送プロトコルとして、ネットワークを介して送られた漬物のいくつかの例を見てきました。

10
Jacob Oscarson

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

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

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

そして、はい、人々はピッキングを使用して計算の状態、または ipython セッションなどを保存します。

7
Mike McKerns

私は自分のプロジェクトの1つでそれを使用しました。作業中にアプリが終了した場合(長いタスクを実行し、大量のデータを処理した場合)、データ構造全体を保存し、アプリの再実行後にリロードする必要がありました。これにはcPickleを使用しました。速度が重要なことであり、データのサイズが本当に大きかったからです。

7
taskinoor

初心者にとって(私もそうですが)、 official documentation を読むときに、最初にpickleを使用する理由を理解するのは本当に難しいです。これはおそらく、ドキュメントが、シリアル化の目的全体を既に知っていることを示唆しているからでしょう。シリアル化の general description を読んだ後にのみ、このモジュールの理由とその一般的な使用例を理解しました。また、特定のプログラミング言語を無視したシリアル化の広範な説明が役立つ場合があります: https://stackoverflow.com/a/14482962/4383472シリアル化とは何ですか?https://stackoverflow.com/a/3984483/4383472

4
Bad

Pickleは、データ構造とクラスの「名前を付けて保存」や「開く」のようなものです。プログラムの実行間でデータ構造が永続的になるようにデータ構造を保存するとします。

保存中:

with open("save.p", "wb") as f:    
    pickle.dump(myStuff, f)        

読み込み中:

try:
    with open("save.p", "rb") as f:
        myStuff = pickle.load(f)
except:
    myStuff = defaultdict(dict)

これで、myStuffを最初から作成し直す必要がなくなり、中断したところから再開できます。

3
spartan

実世界の例を追加するには: Sphinx ドキュメントツールPythonドキュメント間の参照。ドキュメントの以降のビルドを高速化します。

2
lunaryorn

私はあなたが私がそれを使用する用途をあなたに伝えることができ、それが使用されるのを見ました:

  • ゲームプロファイルの保存
  • ゲームデータは命と健康のように保存されます
  • プログラムに入力された発言番号の以前の記録

これらは少なくとも私が使用するものです

1
Austin Gummy

その時点でウェブサイトの1つをウェブスクラップするときにピクルスを使用します.8000k以上のURLを保存し、できるだけ速く処理したいので、出力品質が非常に高いため、ピクルスを使用します。

簡単にURLにアクセスでき、ジョブディレクトリキーでも停止できます。Wordは、プロセスを再開するためにURLの詳細も非常に高速に取得します。

1
Divanshu Tak