Как cpickle сбрасывать и загружать отдельные словари в один и тот же файл? - программирование
Подтвердить что ты не робот

Как cpickle сбрасывать и загружать отдельные словари в один и тот же файл?

У меня есть процесс, который запускает и создает три словаря: 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)

Или даже лучше просто загрузите первые два словаря и сделайте необязательным загрузку третьего (большого). Возможно ли это, или я должен идти об этом совершенно по-другому?

4b9b3361

Ответ 1

Конечно, вы просто выгружаете каждый отдельно, а затем загружаете их отдельно:

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)

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

Ответ 2

Я рекомендую забытый shelve модуль, который эффективно предоставляет вам постоянный словарь, поддерживаемый файлом или файлом DBb Berkley (как выбрано на 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]}}

Ответ 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, smallDict2, largeDict1
Вы можете загрузить только небольшие, установив соответствующий диапазон при загрузке (Здесь for i in range(2) ...)