2009-07-27 6 views

答えて

9

酸洗は2面コインです。

一方では、オブジェクトを非常に簡単な方法で保存する方法があります。ちょうど4行のコードとピックル。オブジェクトはそのままです。

反対側では、互換性の悪夢になることがあります。コードで定義されていないオブジェクトは、ピクル時に定義されたとおりにアンピクルできません。これは、コードをリファクタリングする能力やモジュール内の要素を再配置する能力を強く制限します。 また、すべてを節約することができるわけではありません。あなたが厳守したものに厳しくなく、コードのクライアントがオブジェクトを完全に自由に使用できる場合、遅かれ早かれシステムにunpicklableなものが渡され、システムはブーム。

使用には十分注意してください。すばやく汚いという定義はありません。

+1

リファクタリングに関する問題の場合 –

2

基本的な種類のみ、またはpickleプロトコルを定義したオブジェクトのみ、すべてのオブジェクトを直接的に節約することはできません。
独自のバイナリ形式を使用すると、あらゆる種類のオブジェクトを格納する可能性があります。

ちょうど、Zope Object DB(ZODB)はPickleフォーマットでオブジェクトを保存するのと同じアプローチに従っています。実装を取得することに興味があるかもしれません。

+2

ピクルスは、余分なコードなしで、ほとんどのユーザ定義クラスを扱うことができます。場合によっては、pickleプロトコルの特別な処理を定義するだけで済みます。 – Nelson

1

ピクルスオーバーカスタムフォーマットの潜在的な利点があります:あなたが選択的に個々のオブジェクトを取得することができます

  • 、オブジェクトではなく
  • のフルセットを転生したあなたは、プロパティによって、オブジェクトのサブセットを照会することができます条件に一致するオブジェクトのみをロードする

これらの利点が実現するかどうかは、ストレージの設計方法によって異なります。

3

独自のカスタムバイナリ形式を定義する理由の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はかなり速いです。

1

これを行う場合(独自のバイナリ形式を実装する)、物理と天文学で膨大な量のデータをダンプするために使用されるバイナリ形式のHDF5を処理するライブラリがpythonにあることをまず知っておく必要があります。

これは図書館のホームページです:

基本的には、テーブルの列は、それ自体で、内部テーブルを含めることが可能な階層型データベースとしてHDF5と考えることができ:テーブルPopulationには、Individualと呼ばれる列があり、各個人の情報などを含むテーブルです。

PyTablesには独自のcPickleモジュールが実装されていますそれをESS:

$ easy_install tables 
$ python 
>>> import tables 
>>> tables.cPickle 

私はpytableの漬物を使用したことがないが、私はあなたはそれが動作しません方法を学習することは簡単かもしれないと思うので、あなたがあなた自身のフォーマットを実装する前にそれを見ていることがあります。

0

信頼できない情報源からのデータを処理する必要がありますか?そうであれば、pickle形式は、実際には、unpicklingを行っているプロセスに代わって任意のコードを実行できる仮想マシンであることがわかります。

1

は、SourceForgeのでこの溶液参照:

y_serial.pyモジュールを:: SQLiteの

「シリアライズ+持続性のある倉庫Pythonオブジェクト::数行のコードでは、PythonのSQLiteのにオブジェクトを圧縮し、注釈を付けます。あとでSQLを使用せずにキーワードで時系列的に取得してください。スキーマレスのデータを格納する最も有益な「標準」モジュール。

http://yserial.sourceforge.net

[漬物は、JSON上で選択した理由を解説、ソース文末に含まれては論じている。]

+0

ピクルスを使用する場合、Webベースのプロジェクトでは安全ではありません。 – amirouche

+0

y_serialは、独自の関数で作成された信頼できるpickleをunpickleするだけで安全です。あなたは詳細な説明を与えるモジュールそのものの中身を読むべきです。 –

関連する問題