Эффективный запрос двух больших словарей, хранящихся в файлах pickle - PullRequest
2 голосов
/ 07 мая 2020

У меня есть два больших файла рассола. У обоих хранится по одному словарю. Я не могу загрузить оба файла рассола одновременно в память, однако я хочу объединить хранящиеся в них словари и запросить этот объединенный словарь. Можно ли это сделать? См. Следующие фрагменты, чтобы подробнее узнать о моем запросе.

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, что может повлиять на производительность запросов.

Если это не лучший способ, кто-нибудь, пожалуйста, предложите лучший подход для этого. Еще раз, я очень озабочен эффективностью запросов. Я хочу получить значение из словаря как можно быстрее.

...