回答:
私が遭遇したいくつかの用途:
1)プログラムの状態データをディスクに保存して、再起動時に中断したところから継続できるようにする(持続)
2)マルチコアまたは分散システムでのTCP接続を介したPythonデータの送信(マーシャリング)
3)データベースにPythonオブジェクトを保存する
4)任意のpythonオブジェクトを文字列に変換し、それを辞書キーとして使用できるようにします(たとえば、キャッシュとメモ化のため)。
最後の1つにはいくつかの問題があります。2つの同一のオブジェクトがピクルされ、異なる文字列が生成される可能性があります。または、同じオブジェクトを2回ピクルしても、表現が異なる場合があります。これは、ピクルに参照カウント情報を含めることができるためです。
@lunaryornのコメントを強調するために-慎重に作成されたpickleがシステム上で任意のコードを実行する可能性があるため、信頼できないソースから文字列を取り出してはいけません。たとえば、https://blog.nelhage.com/2011/03/exploiting-pickle/を参照してください
最小限の往復の例
>>> 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
個人的に、漬物オブジェクトがネットワークを介して送信されるいくつかの例を、使いやすいネットワーク転送プロトコルとして見ました。
分散および並列コンピューティングでは、酸洗いが絶対に必要です。
multiprocessing
(またはpyinaを使用してクラスターノード全体で)並列map-reduceを実行したい場合、並列リソース間でマップしたい関数がピクルすることを確認する必要があります。ピクルしない場合は、別のプロセスやコンピューターなどの他のリソースに送信できません。良い例については、こちらもご覧ください。
これを行うには、Pythonのほとんどすべてをシリアル化できるdillを使用します。Dillには、コードが失敗したときにピクリングが失敗する原因を理解するのに役立つ優れたツールもあります。
そして、はい、人々はピッキングを使用して計算の状態やあなたのipythonセッションなどを保存します。
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を最初から作成し直す必要がなくなり、中断したところから再開することができます。
初心者にとって(私と同じように)、公式ドキュメントを読むときに、なぜ最初にピクルスを使用するのかを理解するのは本当に難しいです。それはおそらく、ドキュメントがシリアル化の全体的な目的をすでに知っていることを示唆しているためです。シリアル化の一般的な説明を読んで初めて、このモジュールの理由とその一般的な使用例がわかりました。また、特定のプログラミング言語を無視したシリアライゼーションの幅広い説明が役立つ場合があります。https : //stackoverflow.com/a/14482962/4383472、シリアライゼーションとは何ですか?、 https://stackoverflow.com/a/3984483/4383472