Python 高效查询存储为pickle文件的两个大型词典

Python 高效查询存储为pickle文件的两个大型词典,python,dictionary,pickle,Python,Dictionary,Pickle,我有两个大的pickle文件。这两本书都有一本词典。我不能同时将这两个pickle文件加载到内存中,但是,我希望合并存储在其中的词典,并在此合并词典上查询。有可能这样做吗?请参阅以下代码片段,以了解我的查询中的更多细节 f1 = open('d1.pickle', 'rb') d1 = pickle.load(f1) # However, I can not load a second dictionary as follows in the same program # because of

我有两个大的pickle文件。这两本书都有一本词典。我不能同时将这两个pickle文件加载到内存中,但是,我希望合并存储在其中的词典,并在此合并词典上查询。有可能这样做吗?请参阅以下代码片段,以了解我的查询中的更多细节

f1 = open('d1.pickle', 'rb')
d1 = pickle.load(f1)

# However, I can not load a second dictionary as follows in the same program
# because of memory limits

f2 = open('d2.pickle', 'rb')
d2 = pickle.load(f2)

f3 = open('d_final.pickle', 'wb')
pickle.dump({*d1, *d2}, f3)

更新: 我想对这两本词典进行更快的查询。我的方法之一是将这两个字典存储在一个tsv文件中,然后将行偏移量存储为键的索引。使用这些偏移量,我们可以在该文件位置查找并获得值。但这似乎比查询字典慢得多。我的尝试见下文有人能评论一下这是否是查询这两个词典的最快方法吗?

f = open('merged_dict.tsv', 'wt')

f1 = open('d1.pickle', 'rb')
d1 = pickle.load(f1)

offsets = {}
for key in d1:
    offset = f.tell()
    f.write(key + '\t' + d1[key] + '\n')
    offsets[key] = offset

del f1, d1

f2 = open('d2.tsv', 'rb')
d2 = pickle.load(f2)

for key in d2:
    offset = f.tell()
    f.write(key + '\t' + d2[key] + '\n')
    offsets[key] = offset

f3 = open('dict_offets.pickle', 'wb')
pickle.dump(offsets, f3)
现在,当我需要查询字典时,我会执行以下操作:

f = open('merged_dict.tsv', 'rt')
f1 = open('dict_offsets.pickle', 'rt')

d = pickle.load(f1)

#query the dictionary using following function. 
def query_dictionary(key):
    offset = d[key]
    f.seek(offset)
    return f.readline().split('\t')[1]
我认为将字典存储为tsv文件的性能问题是因为这些值是numpy数组。我需要将字符串转换为numpy数组,这可能会影响查询性能


如果这不是最好的方法,请有人建议更好的方法。我再次高度关注查询的效率。我想尽快从字典中获取值。

你确定你有足够的内存来保存合并的字典吗?@MarkSnyder好的,我知道了。如果不可能在内存中同时存储这两个词典,那么也不可能存储合并后的词典。但是,如果我可以按需查询合并词典而不必将其加载到内存中,那么它真的很棒。或者您对从程序中查询这两个词典有什么其他建议?我还担心查询的效率。我尝试将此词典作为tsv文件编写,但我想这可能会影响查询性能。我将行偏移量存储为索引,以便有效地从该文件中读取行。如果要pickle的数据对于RAM来说太大,则
pickle
不是正确的格式。pickle对象总是一次加载,然后会引发MemoryError。使用可选择性加载的格式(CSV、数据库…)。您的问题不应该是合并两个词典,然后将合并后的词典存储在文件中。你的问题应该是关于“有效地查询两本大词典”。