Pythonでのピクルの一般的な使用例


回答:


59

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

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

2)マルチコアまたは分散システムでのTCP接続を介したPythonデータの送信(マーシャリング)

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

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

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

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


27
漬物データが操作に対して慎重に保護されていない限り、漬物オブジェクトをネットワークまたは他の信頼できないチャネルを介して転送しないでください。pickleのドキュメントでは、信頼できないソースや認証されていないソースからデータを取り出さないように明示的に警告しています。
lunaryorn

4
@lunaryorn:良い点。マシン間でピクルされたデータを転送する場合は、SSLやSSHトンネリングなどの安全なチャネルを使用します。
デイブカービー

3
次に、エンドポイントを悪用しないように信頼します。これは、コンテキストに応じて大丈夫な場合とそうでない場合があります。
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳ 2010

@lunaryorn-良い点ですが、その場合、パブリックドメインでデータを暗号化するにはどうすればよいでしょうか。他のpy libを使用する必要があるのか​​、
それとも

ポイント4)は本当ですか?これは、ここでは機能しないいくつかの(古い)証拠があることがわかりまし
salotz

10

最小限の往復の例

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

編集:しかし、酸洗いの実際の例の問題については、おそらく酸洗い最も高度な使用法(ソースをかなり深く掘り下げる必要があります)はZODBです:http : //svn.zope.org/

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

個人的に、漬物オブジェクトがネットワークを介して送信されるいくつかの例を、使いやすいネットワーク転送プロトコルとして見ました。


8

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

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

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

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


7

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


4

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

初心者にとって(私と同じように)、公式ドキュメントを読むときに、なぜ最初にピクルスを使用するのかを理解するのは本当に難しいです。それはおそらく、ドキュメントがシリアル化の全体的な目的をすでに知っていることを示唆しているためです。シリアル化の一般的な説明を読んで初めて、このモジュールの理由とその一般的な使用例がわかりました。また、特定のプログラミング言語を無視したシリアライゼーションの幅広い説明が役立つ場合があります。https : //stackoverflow.com/a/14482962/4383472シリアライゼーションとは何ですか?https://stackoverflow.com/a/3984483/4383472


あなたの「答え」は答えではなく、それは単なるコメントです。OPの質問は「ピクルスの一般的な使用例は何ですか?」です。その質問に何らかの形で答えたと思いますか?
マイクマッカーンズ2015年

3
まあ、このモジュールについてここここここで読んだときに、ピクルスの一般的な使用法を理解するのも困難だったので、私は質問に答えたと感じています。ほとんどの場合、シリアル化の概念全体の背後にある動機を知っていると想定して、ピクルスが何をするかを説明し始めます。シリアライゼーションに関する簡単なウィキの記事を読んだ後、「一般的なケース」だけでなく、一般的な考えも把握しました。多分それは誰かを助けるでしょう...
Bad

そしてそれらの一般的なケースのいくつかは…?他の回答でここに記載されていないものがある場合は、それらを回答に追加すると非常に適切です。
Mike McKerns 2015年

2

実例を追加するには:Python用のSphinxドキュメンテーションツールは、pickleを使用して、解析されたドキュメントとドキュメント間の相互参照をキャッシュし、ドキュメントのその後のビルドを高速化します。


1

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

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

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


1

私はその時点でWebサイトの1つを廃棄するときに酸洗いを使用しています。8000kを超えるURLを保存し、それらをできるだけ高速に処理したいので、出力品質が非常に高いため、酸洗いを使用します。

URLに簡単にアクセスでき、ジョブディレクトリのキーワードを停止した場合でも、プロセスを再開するためにURLの詳細を非常に速くフェッチできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.