2012-02-10 12 views
4

私の辞書は数千のキーで構成され、各キーは1000x1000のnumpy配列を値として持ちます。ファイルを人間が読めるようにする必要はありません。小型で高速な積載時間が重要です。Pythonで大きな(巨大ではない)dictonariesを保存するには?

最初にsavematを試しましたが、problemsに遭遇しました。 Pickleは巨大なファイルを作成しました。私はcsvでも同じと仮定します。私はjson(おそらく巨大な可読性のあるテキスト)またはdb(おそらく複雑)を使って推薦する投稿を読んだ。私の場合は何をお勧めしますか?

+0

どのくらい大きなですか? – RussS

+0

「巨大なファイルに」?巨大な定義。 1000x1000は百万の値です。それぞれの値はint型です。次に、4Mbのデータがあります。 –

+0

@ S.Lottこれは1,6 GBのファイル – Framester

答えて

6

あなたはキーが文字列の辞書を持っていると値は次のように、配列の場合:

>>> numpy.savez('file.npz', **arrs) 

>>> import numpy 
>>> arrs = {'a': numpy.array([1,2]), 
      'b': numpy.array([3,4]), 
      'c': numpy.array([5,6])} 

あなたは圧縮ファイルに、キーによって、それらを保存するためにnumpy.savezを使用することができます

それをバックロードするには:

>>> npzfile = numpy.load('file.npz') 
>>> npzfile 
<numpy.lib.npyio.NpzFile object at 0x1fa7610> 
>>> npzfile['a'] 
array([1, 2]) 
>>> npzfile['b'] 
array([3, 4]) 
>>> npzfile['c'] 
array([5, 6]) 
+0

ありがとうございますが、私はファイル名をキーに使って問題に遭遇しました:http://stackoverflow.com/q/9258069/380038 – Framester

+0

キー名をエスケープするだけです。 – jterrace

+0

また、このNpzFileオブジェクトは、単純な辞書イン、辞書アウトが必要な場合に備えて、辞書に型キャストすることができます。 – alex

3

ファイルシステム自体は、あまり評価されていないデータ構造です。あなたのキーからファイル名へのマップである辞書を持つことができ、各ファイルには1000x1000の配列があります。辞書をpicklingするのはすばやく簡単で、データファイルには生データ(numpyが簡単に読み込める)だけが含まれています。

+0

すばらしい答えをありがとう。私は実際にはすべてのキーを1つのファイルatmとして持っていますが、これらのファイルをすべて読み込むには〜15分かかります。 – Framester

+0

@Framester:ファイルのサイズの代わりにファイルの数が少ないため、速度が遅いことがわかります。 – Nobody

+2

@Framester:メモリマップファイル([mmapモジュール](http://docs.python.org/library/mmap.html))を使って調査してください。データを「ロード」するコストはほとんどなく、オンデマンドでアクセスできます。あなたはすべてのデータをmmapするために64ビットのOSが必要な場合があります。 –

2

どうnumpy.savezは?それは複数のnumpy配列を保存することができ、バイナリであるので、pickleよりも速くなければなりません。

+1

また、プロトコル0(ASCII)以外のものを使用している限り、ピクルされたデータもバイナリです。速度を上げるには、['cPickle'](http://docs.python.org/library/pickle.html#module-cPickle)を使用します。 –

+0

@GregHewgill私はcPickleを知っていましたが、バイナリピクルを持つことができるかどうかはわかりませんでした。ありがとう! //良いフォローアップを台無しにするつもりはありませんが、私はsavepyを使用する方が速いですが、これはnumpy配列の保存に特化しているからです。まあ、サイズにもよると思いますので、もちろんベンチマークが必要です。 – tkf

+0

はい、この場合は 'savez'が適切です。ちょうどあなたに違った漬け物のプロトコルを知らせるようにしたかったのです。 –

0

GoogleのProtobuf仕様はオーバーヘッドで非常に効率的に設計されています。私はそれをシリアライズするのはどれくらい速いのかは分かりませんが、Googleになっているのは、それが手のひらではないと思います。

0

PyTables(http://www.pytables.org/moin)を使用して、データをHDF5形式で保存できます。

関連する問題