ピクルスのドキュメントを見ましたが、ピクルスがどこで役立つのかわかりません。
ピクルスの一般的な使用例は何ですか?
私が遭遇したいくつかの用途:
1)プログラムの状態データをディスクに保存して、再起動時に中断したところから続行できるようにします(永続性)
2)マルチコアまたは分散システムでTCP接続を介してPythonデータを送信する(マーシャリング)
3)Pythonオブジェクトをデータベースに保存する
4)任意のPythonオブジェクトを文字列に変換して、辞書キーとして使用できるようにします(キャッシュやメモ化など)。
最後の1つにはいくつかの問題があります-2つの同一のオブジェクトがピクルスにされて異なる文字列になる可能性があります-または2回ピクルスにされた同じオブジェクトでさえ異なる表現を持つ可能性があります。これは、ピクルスに参照カウント情報を含めることができるためです。
@lunaryornのコメントを強調するために、信頼できないソースから文字列を選択解除しないでください。慎重に作成されたピクルスがシステム上で任意のコードを実行する可能性があるためです。たとえば、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
個人的には、使いやすいネットワーク転送プロトコルとして、漬け物がネットワーク経由で送信される例をいくつか見てきました。
私は自分のプロジェクトの1つでそれを使用しました。アプリが動作中に終了した場合(長いタスクを実行し、大量のデータを処理した場合)、データ構造全体を保存し、アプリの再実行後にリロードする必要がありました。速度が重要であり、データのサイズが非常に大きいため、これにはcPickleを使用しました。
分散コンピューティングと並列コンピューティングには、ピクルスが絶対に必要です。
並列map-reduceを使用して(またはpyinamultiprocessing
を使用してクラスターノード間で)実行したいとします。次に、並列リソース間でマップしたい関数が機能することを確認する必要があります。酸洗いしないと、別のプロセスやコンピューターなどの他のリソースに送信できません。良い例については、こちらも参照してください。
これを行うために、私はdillを使用します。これは、Pythonでほとんどすべてをシリアル化できます。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
実際の例を追加するには:Python用のSphinxドキュメントツールは、pickleを使用して、解析されたドキュメントとドキュメント間の相互参照をキャッシュし、ドキュメントの後続のビルドを高速化します。
私がそれを使用している用途をあなたに伝えることができ、それが次の用途に使用されているのを見てきました:
それらは私が少なくともそれを使用するものです
当時、ウェブサイトの1つでウェブスクレイピング中にピクルスを使用しています。8000k以上のURLを保存し、できるだけ速く処理したいので、出力品質が非常に高いため、ピクルスを使用します。
簡単にURLにアクセスでき、ジョブディレクトリのキーワードでさえ停止すると、プロセスを再開するためにURLの詳細を非常に高速に取得できます。