17

私は3つの辞書を実行して作成するプロセスを持っています.2つはかなり小さく、1つは大きいです。

次のような辞書を 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 番目の (大きい) 辞書をロードするかどうかをオプションにします。これは可能ですか、それともまったく別の方法でこれを行う必要がありますか?

4

3 に答える 3

26

もちろん、それぞれを個別にダンプしてから、個別にロードするだけです。

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)

大きなものを最初にロードせずに小さなものをロードできるように、大きなものを最後にダンプするようにしてください。巧妙になって、各ダンプが始まるファイル位置をある種のヘッダーに保存し、ロードする前にその場所をシークすることもできると思います (ただし、これは少し複雑になり始めています)。

于 2012-07-25T01:37:27.793 に答える
6

shelveBerkley DB ファイルまたは dbm ファイル (で選択) に基づく永続的な辞書を効果的に提供する、忘れられがちなモジュールをお勧めしますanydbm。データベースはパフォーマンスの向上を提供する必要があります(大きな辞書の場合)。

使用例:

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]}}
于 2012-07-25T02:24:31.100 に答える