2012-04-05 6 views
0

Я хотел бы, чтобы моя программа хранила данные для последующего использования. До сих пор не проблема: в Python есть много способов сделать это.Стойкие ссылки в Python

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

Я знаю решение: модуль рассола сохраняет следы ссылок и будет помнить, что мои списки X и Y точно такие же (не только их содержимое, но и их ссылки).

Тем не менее, проблема с использованием pickle заключается в том, что он работает, если вы сбрасываете все данные в одном файле. Это не очень умно, если у вас большой объем данных.

Вы знаете другой способ справиться с этой проблемой?

+0

Из Python 2.6 есть модуль JSON, который мог подгонять ваши потребности. – wvd

+0

'проблема с использованием pickle заключается в том, что он работает, если вы выгружаете все данные в один файл. Что не очень умно, если у вас большой объем данных. 'Насколько велики ваши данные? – Simon

ответ

0

ZODB разработан для сохранения постоянных объектов python и всех ссылок. Просто наследуйте свой класс от Persistent и получайте удовольствие. http://www.zodb.org/

2

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

>>> class X(object): 
...  # just some object to be pickled 
...  pass 
... 
>>> l1 = [X(), X(), X()] 
>>> l2 = [l1[0], X(), l1[2]] 
>>> state = {'l1': l1, 'l2': l2} 
>>> saved = pickle.dumps(state) 
>>> restored = pickle.loads(saved) 
>>> restored['l1'][0] is restored['l2'][0] 
True 
>>> restored['l1'][1] is restored['l2'][1] 
False 
1

Я бы Recommand с помощью shelve над маринадом. Он имеет более высокую функциональность и более прост в использовании.

http://docs.python.org/library/shelve.html

Если у вас есть проблемы с производительностью, потому что вы манипулируете очень большое количество данных, вы можете попробовать другие librairies как pyTables:

http://www.pytables.org/moin