17

我有一个运行并创建三个字典的进程:2 个相当小,1 个很大。

我知道我可以存储一本字典,例如:

import cPickle as pickle
with open(filename, 'wb') as fp:
  pickle.dump(self.fitResults, fp)

我想做的是将所有 3 个字典存储在同一个文件中,并能够在另一个时间分别加载三个字典。就像是

with open(filename, 'rb') as fp:
  dict1, dict2, dict3 = pickle.load(fp)

或者更好的是只加载前两个字典,并使其可选是否加载第三个(大)字典。这是可能的还是我应该以完全不同的方式来解决这个问题?

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

我推荐经常被遗忘的shelve模块,它有效地为您提供由 Berkley DB 文件或 dbm 文件(由 选择anydbm)支持的持久字典。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]}}
于 2012-07-25T02:24:31.100 回答
3

如此处所述,您可以将多个对象腌制到同一个文件中,然后将它们全部加载(以相同的顺序):

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以下 顺序 存储字典smallDict2largeDict1

for i in range(2) ...

于 2015-09-03T19:57:30.743 回答