2009-03-12 2 views
4

私はディスクにシリアル化したい大きなオブジェクトを持っています。私はmarshalがかなりうまく動作していることを発見しており、素早く素敵です。Python:オブジェクトをインクリメンタルに整列化/ピクルしますか?

今は大きなオブジェクトを作成してから、marshal.dumpを呼び出しています。可能であれば、大きなオブジェクトをメモリに保持しないようにしたいと思います。ビルドするにつれて、それを徐々にダンプしたいと思います。それは可能ですか?

オブジェクトはかなり単純です、配列の辞書です。

答えて

0

これは、オブジェクトをどのように構築するかによって大きく異なります。サブオブジェクトの配列ですか?あなたはそれを構築するときに各配列要素をマーシャル/ピクルすることができます。それは辞書ですか?

大きな複雑なハリーオブジェクトの場合は、オブジェクトの各部分をマスダンプしてから、読んだときにあなたの「ビルド」プロセスを適用したい場合があります(マーシャル/ピクルキー)。

+0

質問を更新しました。オブジェクトはかなりシンプルで、配列の辞書です。各アレイは非常に小さいです。私は個々の配列をマーシャリングするだろうか?同じファイルに? – Parand

0

アイテムを1つずつファイルにダンプすることができます。和解を必要とする2つの設計上の質問は次のとおりです。

  1. オブジェクトをメモリに格納するときに、どのように構築していますか?
  2. メモリが不足しているときに、データはどのように必要ですか?

ビルドプロセスが一度に与えられたキーに関連付けられた配列全体を移入した場合、あなただけのキーをダンプするかもしれません:アップデートに続いて

big_hairy_dictionary['sample_key'] = pre_existing_array 
marshal.dump({'sample_key':big_hairy_dictionary['sample_key']},'central_file') 

:別の辞書として、ファイル内の配列のペアをmarshal.load( 'central_file')を呼び出すたびに、中央辞書の更新に使用できる辞書が返されます。しかし、実際には、データが必要なときに、キーごとに 'central_file'の読み込みを処理する必要がある場合にのみ役立ちます。

代わりに、あなたが順不同に要素による配列要素を移植されている場合は、多分試してみてください。

big_hairy_dictionary['sample_key'].append(single_element) 
marshal.dump(single_element,'marshaled_files/'+'sample_key') 

その後、あなたはそれをバックロードするとき、あなたは必ずしも取得するために全体の辞書を構築する必要はありません。必要なものを取り戻す。それがNoneを返すまで、marshal.load( 'marshaled_files/sample_key')を呼び出すだけで、そのキーに関連するすべてのものが得られます。

4

bsddbモジュールの 'hashopen'と 'btopen'関数は、永続的な辞書のようなインターフェイスを提供します。たぶん、通常の辞書の代わりにこれらのうちの1つを使用して、配列をディスクに段階的にシリアル化することができますか?

import bsddb 
import marshal 

db = bsddb.hashopen('file.db') 
db['array1'] = marshal.dumps(array1) 
db['array2'] = marshal.dumps(array2) 
... 
db.close() 

の配列を取得するには:

db = bsddb.hashopen('file.db') 
array1 = marshal.loads(db['array1']) 
... 
4

それはすべてあなたのオブジェクトが関係していますが、リストの辞書で、その後、あなたはshelve moduleを使用することができる場合があります。キーと値がメモリではなくデータベースファイルに格納される、辞書のようなインターフェイスを提供します。あなたに影響するかもしれない1つの制限はShelfオブジェクトのキーが文字列でなければならないということです。より効率的なバイナリ表現を使用するためにShelfオブジェクトを作成するときにprotocol = -1を指定すると、値の格納がより効率的になります。

+0

なぜこれは正しくマークされていませんか?この回答に追加するには、シェルビングされたオブジェクトの書き戻し/変更について知っておいてください。 – Karthick

関連する問題