私は、dbmsエンジンのような永続ストレージを作成する考えをしていますが、オブジェクトを直接cPicklingしたり、shelveモジュールを使用してカスタムバイナリ形式を作成するとどんなメリットがありますか?cPickleを使用してデータ用の永続ストレージを作成しないと得られるメリットは何ですか?
答えて
酸洗は2面コインです。
一方では、オブジェクトを非常に簡単な方法で保存する方法があります。ちょうど4行のコードとピックル。オブジェクトはそのままです。
反対側では、互換性の悪夢になることがあります。コードで定義されていないオブジェクトは、ピクル時に定義されたとおりにアンピクルできません。これは、コードをリファクタリングする能力やモジュール内の要素を再配置する能力を強く制限します。 また、すべてを節約することができるわけではありません。あなたが厳守したものに厳しくなく、コードのクライアントがオブジェクトを完全に自由に使用できる場合、遅かれ早かれシステムにunpicklableなものが渡され、システムはブーム。
使用には十分注意してください。すばやく汚いという定義はありません。
基本的な種類のみ、またはpickleプロトコルを定義したオブジェクトのみ、すべてのオブジェクトを直接的に節約することはできません。
独自のバイナリ形式を使用すると、あらゆる種類のオブジェクトを格納する可能性があります。
ちょうど、Zope Object DB(ZODB)はPickleフォーマットでオブジェクトを保存するのと同じアプローチに従っています。実装を取得することに興味があるかもしれません。
ピクルスは、余分なコードなしで、ほとんどのユーザ定義クラスを扱うことができます。場合によっては、pickleプロトコルの特別な処理を定義するだけで済みます。 – Nelson
ピクルスオーバーカスタムフォーマットの潜在的な利点があります:あなたが選択的に個々のオブジェクトを取得することができます
- 、オブジェクトではなく
- のフルセットを転生したあなたは、プロパティによって、オブジェクトのサブセットを照会することができます条件に一致するオブジェクトのみをロードする
これらの利点が実現するかどうかは、ストレージの設計方法によって異なります。
独自のカスタムバイナリ形式を定義する理由の1つが最適化である可能性があります。 pickle(およびpickleを使用するshelve)は、汎用シリアル化フレームワークです。ほぼすべてのPythonデータを格納できます。多くの状況でピクルを使用するのは簡単ですが、すべてのオブジェクトを検査してデータをシリアライズするには時間がかかり、データ自体は一般的な詳細な形式で保存されます。特定の既知のデータを保存している場合は、カスタム・シリアライザはより高速で簡潔になります。
これは、単一の整数値を持つオブジェクトを酸洗いするために37のバイトを要する:
そのデータに埋め込ま>>> import pickle >>> class Foo: pass... >>> foo = Foo() >>> foo.x = 3 >>> print repr(pickle.dumps(foo)) "(i__main__\nFoo\np0\n(dp1\nS'x'\np2\nI3\nsb."
プロパティとその型の名前です。 Foo(とFooだけ)のカスタムシリアライザでは、それを省略して番号を格納するだけで、時間と空間の両方を節約できます。
カスタムシリアル化フレームワークのもう一つの理由は、カスタム検証とデータのバージョニングを簡単に行うことができることです。オブジェクトタイプを変更し、古いバージョンのデータをロードする必要がある場合は、pickleを使用してトリッキーにすることができます。独自のコードを簡単にカスタマイズして古いデータ形式を処理することができます。
実際には、一般的なcPickleモジュールを使用して何かを構築し、それが本当に重要であることをプロファイリングが示している場合にのみ置き換えます。別のシリアライゼーションフレームワークを維持することは、相当量の作業です。
最終的な参考資料としては、some synthetic serializer benchmarksが便利です。 cPickleはかなり速いです。
これを行う場合(独自のバイナリ形式を実装する)、物理と天文学で膨大な量のデータをダンプするために使用されるバイナリ形式のHDF5を処理するライブラリがpythonにあることをまず知っておく必要があります。
これは図書館のホームページです:
基本的には、テーブルの列は、それ自体で、内部テーブルを含めることが可能な階層型データベースとしてHDF5と考えることができ:テーブルPopulationには、Individualと呼ばれる列があり、各個人の情報などを含むテーブルです。
PyTablesには独自のcPickleモジュールが実装されていますそれをESS:
$ easy_install tables
$ python
>>> import tables
>>> tables.cPickle
私はpytableの漬物を使用したことがないが、私はあなたはそれが動作しません方法を学習することは簡単かもしれないと思うので、あなたがあなた自身のフォーマットを実装する前にそれを見ていることがあります。
信頼できない情報源からのデータを処理する必要がありますか?そうであれば、pickle形式は、実際には、unpicklingを行っているプロセスに代わって任意のコードを実行できる仮想マシンであることがわかります。
は、SourceForgeのでこの溶液参照:
y_serial.pyモジュールを:: SQLiteの
「シリアライズ+持続性のある倉庫Pythonオブジェクト::数行のコードでは、PythonのSQLiteのにオブジェクトを圧縮し、注釈を付けます。あとでSQLを使用せずにキーワードで時系列的に取得してください。スキーマレスのデータを格納する最も有益な「標準」モジュール。
http://yserial.sourceforge.net
[漬物は、JSON上で選択した理由を解説、ソース文末に含まれては論じている。]
ピクルスを使用する場合、Webベースのプロジェクトでは安全ではありません。 – amirouche
y_serialは、独自の関数で作成された信頼できるpickleをunpickleするだけで安全です。あなたは詳細な説明を与えるモジュールそのものの中身を読むべきです。 –
- 1. Xcodeを使用してシミュレータデバイス上のコアデータ永続ストレージをブラウズできますか?
- 2. spring-wsクライアントを使用して永続的な接続を作成する
- 3. Docker for Mac:永続ストレージの使用
- 4. Springデータを使用してデータがデータベースに永続化されない
- 5. ezコンポーネントは永続オブジェクトを使用してデータを取得します
- 6. Reduxは永続的なデータ構造を使用していますか?
- 7. ので、私はこのチュートリアルを見ていた永続的なストレージとして
- 8. docker-compose up-up-upで永続的なストレージを作成するにはどうすればいいですか?
- 9. Arrays.asList()を使用してリストを作成するメリット
- 10. PhonegapとTitaniumを使用するメリットとデメリットは何ですか?
- 11. 永続操作を可能にする非永続データ構造とは何でしょうか?
- 12. スタンドアロンプログラム用のjaxbを使用してJavaでデータを永続化する
- 13. 永続データにDockerを使用する利点は何ですか
- 14. Ember.js:JSONAPIAdapterを使用してバックエンドからデータを取得する - 動作しない
- 15. Dokkuと永続ストレージ
- 16. 永続テンプレートから作成された型の使い方は?
- 17. AzureのURLRewriteは永続キャッシュを使用していますか?
- 18. 永続セグメントツリーとは何ですか?どのように使用しますか?
- 19. Python Appの永続データを作成してアクセスする
- 20. SSISのRAWファイルのメリットとデメリットは何ですか?また、いつそれらを使用しますか?
- 21. out/refとreturnを使用するメリットは何ですか?
- 22. OpenIDを使用するメリットとデメリットは何ですか?
- 23. Protocol vs Inheritanceを使用するメリットとデメリットは何ですか?
- 24. セレンに "xpath"を使用するメリットとデメリットは何ですか?
- 25. MongoDBはアプリケーションログの永続ストレージとして適切な選択ですか
- 26. Aerospikeを永続レイヤーとして使用できますか?
- 27. NativeScript:ビューデータバインディングを使用した永続的なキャッシュ/ストレージの最適化
- 28. Spring WebFluxでWebSessionを使用してデータを永続化する方法は?
- 29. ステートフルセッションBeanを使用してページ間でデータを永続化する方法は?
- 30. TomEE sesison永続ストレージが動作しない
リファクタリングに関する問題の場合 –