2015-10-25 2 views
1

Если у меня довольно большая структура данных, например, список или словарь, и я загружаю его из файла pickle в Python, а затем изменяю только одну или две записи, могу ли я обновить только те записи в файл или мне нужно записать всю структуру данных обратно в файл? Идея заключается в том, чтобы избежать чрезмерной и ненужной активности жесткого диска, особенно при написании.Обновление файла Pickle Python

Если я не могу этого сделать, я думаю, мне нужно перейти на базу данных?

UPDATE: Я пытался @ рекомендации Pynchia, чтобы использовать shelve модуль, и это делает работу хранения и модификации данных. Мне нужно только подтвердить, что, когда я изменяю поле одного номера телефона, на это записывается только одно поле или максимум одна запись на диск, а не весь набор данных. Это так или нет? Вот в чем вопрос.

import shelve 

s = shelve.open('test.dat') 
for i in range(3): 
    record = {'name': 'ABC'+str(i), 'phone': ((str(i)*3)+'-'+(str(i)*4)), 
       'addr': (str(i)*3)+' Main St'} 
    s[str(i)] = record 
s.close 

s = shelve.open('test.dat') 
for i in range(3): 
    print(s[str(i)]) 
s.close 

s = shelve.open('test.dat') 
temp = s['1'] 
temp['phone']='1-800-GET-PYTHON' 
s['1']=temp 
s.close 

print() 
s = shelve.open('test.dat') 
for i in range(3): 
    print(s[str(i)]) 
s.close 

Выход:

{'name': 'ABC0', 'addr': '000 Main St', 'phone': '000-0000'} 
{'name': 'ABC1', 'addr': '111 Main St', 'phone': '111-1111'} 
{'name': 'ABC2', 'addr': '222 Main St', 'phone': '222-2222'} 

{'name': 'ABC0', 'addr': '000 Main St', 'phone': '000-0000'} 
{'phone': '1-800-GET-PYTHON', 'addr': '111 Main St', 'name': 'ABC1'} 
{'name': 'ABC2', 'addr': '222 Main St', 'phone': '222-2222'} 
+0

Просьба привести конкретный пример. Вы посмотрели [полка] (https://pymotw.com/2/shelve/)? Может быть, это может помочь – Pynchia

+0

@Pynchia Пожалуйста, см. Мое обновленное сообщение. – mcu

+0

Благодарю вас за данные. Shelve построен на вершине 'pickle', поэтому я не думаю, что он сможет удовлетворить ваши требования. Я не эксперт по маринуемому/полку, давайте подождем гуру. Я предложил это, потому что мне было непонятно, если вы хотите обновить целую запись в последовательности записей или поле/атрибут только в пределах одной записи. – Pynchia

ответ

1

Формат файла рассол представляет собой последовательный формат. Таким образом, если вы меняете один элемент, по крайней мере все, что находится за этой позицией в файле, должно быть переписано.

К сожалению, я не знаю и не могу себе представить, как может работать обновление одного элемента.

В зависимости от структуры ваших данных я вижу две возможности:

  1. данные, которые могут быть представлены в виде строк и содержит лишь небольшое количество данных в поле => использовать базу данных как SQLite (есть много другие базы данных, некоторые документально-ориентированные, некоторые действуют как словарь)
  2. несколько больших наборов данных => используйте файл контейнера HDF5. HDF5 предназначен для хранения больших наборов данных и доступа только к необходимым деталям.
+0

Я буду смотреть в файл HDF5, когда у меня будет больше времени. Спасибо за совет. – mcu

+0

Теперь, когда вы добавили свой примерный набор данных, я не думаю, что HDF5 подходит для работы. Это предназначено для действительно больших числовых наборов данных. Реляционная база данных, такая как sqlite, является идеальным решением для вашего набора данных, если число полей фиксировано. В противном случае я бы предложил MongoDB, который имеет действительно хорошие привязки Python.Преимущество sqlite заключается в том, что он является частью стандартной библиотеки Python и не требует сервера. –