Вопрос

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

dictionary[str(instantiated_class_id_number)].attribute1

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

Это было полезно?

Решение

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

Разница в том, что когда вы добавляете класс в словарь, хранятся ссылка, но Shels держит маринованную (сериализованную) копию объекта. Если вы затем измените объект, вы измените копию в памяти, но не маринованную версию. Которые могут быть обработаны (в основном) прозрачно shelf.sync() а также shelf.close(), который выписывают записи. Создание всему этой работе требуется отслеживание всех извлеченных объектов, которые еще не были записаны, поэтому вам нужно позвонить в Sheld.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» потерян из кэша, поэтому он не записан.

Другие советы

Да это так правдоподобный:

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

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

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

Заботиться, это не совсем dict. Отказ Смотри, например, ответ Лауриона.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top