私は、2つの小さい辞書と1つの大きい辞書の3つの辞書を実行して作成するプロセスを持っています。
私は次のような辞書を1つ保存できることを知っています。
import cPickle as pickle
with open(filename, 'wb') as fp:
pickle.dump(self.fitResults, fp)
私がしたいことは、3つの辞書すべてを同じファイルに保存し、3つの辞書を別のときに個別にロードできるようにすることです。何かのようなもの
with open(filename, 'rb') as fp:
dict1, dict2, dict3 = pickle.load(fp)
または、最初の2つの辞書をロードし、3番目の(大きい)辞書をロードするかどうかをオプションにすることもできます。これは可能ですか、それともまったく別の方法でこれに取り組む必要がありますか?
もちろん、それぞれを個別にダンプしてから、個別にロードするだけです。
with open(filename,'wb') as fp:
pickle.dump(dict1,fp)
pickle.dump(dict2,fp)
pickle.dump(dict3,fp)
with open(filename,'rb') as fp:
d1=pickle.load(fp)
d2=pickle.load(fp)
d3=pickle.load(fp)
大きなものを最後にダンプして、大きなものを最初にロードせずに小さなものをロードできるようにしてください。私はあなたが賢いものを得て、各ダンプが始まるヘッダーのファイル位置をソートのヘッダーに保存し、ロードする前にその場所を探すことができると想像します(しかし、それは少し複雑になり始めています)。
私は、忘れられがちな shelve
モジュールをお勧めします。これにより、(anydbm
によって選択された)Berkley DBファイルまたはdbmファイルによってサポートされる永続的な辞書が効果的に提供されます。 dbはパフォーマンスを向上させるはずです(大きな辞書の場合)。
使用例:
import shelve
shelf = shelve.open('my_shelf')
>>> shelf
{}
# add your dictionaries (or any pickleable objects)
shelf['dict1'] = dict(a=10, b=20, c=30, l=[10, 20, 30])
shelf['dict2'] = dict(a=100, b=200, c=300, l=[100, 200, 300])
shelf['dict3'] = dict(a=1000, b=2000, c=3000, l=[1000, 2000, 3000])
>>> shelf
{'dict1': {'a': 10, 'c': 30, 'b': 20, 'l': [10, 20, 30]}, 'dict3': {'a': 1000, 'c': 3000, 'b': 2000, 'l': [1000, 2000, 3000]}, 'dict2': {'a': 100, 'c': 300, 'b': 200, 'l': [100, 200, 300]}}
shelf.close()
# then, later
shelf = shelve.open('my_shelf')
>>> shelf
{'dict1': {'a': 10, 'c': 30, 'b': 20, 'l': [10, 20, 30]}, 'dict3': {'a': 1000, 'c': 3000, 'b': 2000, 'l': [1000, 2000, 3000]}, 'dict2': {'a': 100, 'c': 300, 'b': 200, 'l': [100, 200, 300]}}
前述のように here を使用すると、複数のオブジェクトを同じファイルにピクルし、すべてを(同じ順序で)ロードできます。
_f = file(filename, 'wb')
for obj in [dict1, dict2, dict3]:
cPickle.dump(obj, f, protocol=cPickle.HIGHEST_PROTOCOL)
f.close()
_
次に:
_f = file(filename, 'rb')
loaded_objects = []
for i in range(3):
loaded_objects.append(cPickle.load(f))
f.close()
_
辞書を特定の順序で保存して、ロード中に、優先する辞書のみを選択することができます。
たとえば、辞書を次の順序で保存する場合:_smallDict1
_、_smallDict2
_、_largeDict1
_
ロード中に適切な範囲を設定することにより、小さなものだけをロードできます
(ここにfor i in range(2) ...
)