Когда PersistentDict, когда Папка? - PullRequest
4 голосов
/ 29 февраля 2012

Когда я должен использовать PersistentDict, и когда я должен использовать папку?В чем разница между ними с точки зрения обновлений, внутренней структуры, производительности и т. Д.?

Ответы [ 2 ]

3 голосов
/ 01 марта 2012

A PersistentMapping - это просто реализация типа python dict (через стандартную библиотеку UserDict base class), настроенная на семантику сохраняемости ZODB; это избавляет от необходимости устанавливать флаг _p_changed в ближайшем классе, который наследуется от Persistent каждый раз, когда вы изменяете mapping.

A Folder - гораздо более богатый тип, реализующий события, интеграцию с веб-интерфейсом Zope (ZMI), произвольные свойства через Интернет (атрибуты с проверкой типа), управление разрешениями Zope, проверка подпункта. идентификаторы, импорт / экспорт и т. д. Папки подэлементов хранятся в виде атрибутов на самом объекте, а некоторые метаданные хранятся в частном тексте в экземпляре.

Используйте Folder, когда вам нужны какие-либо из этих дополнительных сервисов (делегирование разрешений, проверка идентификатора и т. Д.), Используйте PersistentMapping в противном случае. Производительность при поиске или хранении предметов не сильно отличается; один - прямой питон dict внизу, другой - экземпляр __dict__, хранящий предметы.

Если вы ищете предотвращение конфликтов, вам следует заглянуть в BTrees , класс OOBTree в основном представляет собой постоянное отображение, в котором значения хранятся в постоянных сегментах, избегая коллизий в большинстве случаев и предоставляя конфликт разрешение для отдыха.

Если вам нужна семантика Folder с семантикой хранения BTree, посмотрите Products.BTreeFolder2 и дополнение, которое реализует интерфейсы Folder, но сохраняет подобъекты в OOBTree вместо атрибутов непосредственно в экземплярах.

2 голосов
/ 29 февраля 2012

A PersistentDict (теперь называется PersistentMapping ) - это класс, который наследуется от UserDict.IterableUserDict и persistent.Persistent .

UserDict. .

Таким образом, PersistentDict (или PersistentMapping) - это в основном словарь, который может храниться как объект в ZODB.

Обычные словари нельзя хранить как отдельные объекты в ZODB. Они должны быть атрибутами некоторого класса, который наследуется от persistent.Persistent .

PersistentDict хранит свои ключи и значения внутри фактического словаря (атрибут data ).

PersistentDict не может быть добавлен через ZMI, и я думаю, что он предназначен в основном для особого случая, когда вы хотите сохранить словарь непосредственно в zodb.

С папкой Полагаю, вы имеете в виду папку в zope.container.folder . Папка хранит свои дочерние элементы в объекте OOBTree, который является контейнером, который может содержать большое количество объектов.

Если вы хотите, чтобы контейнер содержал экземпляры других типов контента, вам лучше использовать папку.

Папка имеет интерфейсы, которых нет у PersistentDict, и эти интерфейсы могут потребоваться для работы определенных адаптеров или других компонентов. Например, событие ContainerModified будет срабатывать только тогда, когда была изменена папка, а не PersistentDict. Подобные ошибки могут быть разными, если вы используете PersistentDict в качестве папки общего назначения.

Когда дело касается производительности, словарь обычно будет работать быстрее, пока пространство клавиш не станет очень большим. Затем весы наклоняются к OOBTree.

...