首页 > 解决方案 > 高效查询存储为 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 数组,这可能会影响查询性能。

如果这不是最好的方法,请有人为此提出更好的方法。再一次,我非常关心查询的效率。我想尽快从字典中获取值。

标签: pythondictionarypickle

解决方案


推荐阅读