Доступ к словарям VS, получающий доступ к полкам

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

dictionary[str(instantiated_class_id_number)].attribute1

Из-за проблем памяти, я хочу использовать shelve модуль. Я задаюсь вопросом, если выполнение так вероятно. Отложить словарь действуют то же самое как стандартный словарь? В противном случае, как это отличается?

1
задан Brian 4 August 2010 в 21:11
поделиться

2 ответа

Полка не действует точно так же, как словарь, особенно при изменении объектов, которые уже есть в словаре.

Разница в том, что когда вы добавляете класс в словарь, ссылка сохраняется, а на полке хранится обработанная (сериализованная) копия объекта. Если вы затем измените объект, вы изменить копию в памяти, но не маринованную версию. Это может быть обработано (в большинстве случаев) прозрачно с помощью Shelter.sync () и полки.close () , которые выписывают записи. Выполнение всей этой работы требует отслеживания всех извлеченных объектов, которые еще не были записаны обратно, поэтому вам нужно вызвать полку.sync (), чтобы очистить кеш.

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

Этот код не работает должным образом с полкой, но будет работать со словарем:

s["foo"] = MyClass()
s["foo"].X = 8 
p = s["foo"] # store a reference to the object
p.X = 9 # update the reference
s.sync() # flushes the cache
p.X = 0
print "value in memory: %d" % p.X # prints 0
print "value in shelf: %d" % s["foo"].X # prints 9

Синхронизация очищает кеш, поэтому измененный объект 'p' теряется из кеша и не записывается обратно.

2
ответ дан 2 September 2019 в 22:26
поделиться

Да, это правдоподобно :

Объекты полки поддерживают все методы, поддерживаемые словарями. Это упрощает переход от скриптов на основе словаря к скриптам, требующим постоянного хранения.

Вам нужно вызывать shelby.sync () время от времени, чтобы очистить кеш.

РЕДАКТИРОВАТЬ

Будьте осторожны, это не совсем изречение . См., Например, Ответ Лауриона.

Да, и у вас могут быть только ключи str .

0
ответ дан 2 September 2019 в 22:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: