Доступ к словарям VS Доступ к полкам - PullRequest
1 голос
/ 05 августа 2010

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

dictionary[str(instantiated_class_id_number)].attribute1

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

Ответы [ 2 ]

2 голосов
/ 05 августа 2010

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

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

Проблема с shelf.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' теряется из кеша, поэтому он не записывается обратно.

0 голосов
/ 05 августа 2010

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

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

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

EDIT

Береги себя, это не совсем dict. Смотрите, например Ответ Лауриона.

О, и вы можете иметь только str ключей.

...