Когда PersistentDict, когда Папка?
Когда я должен использовать PersistentDict, и когда я должен использовать папку? В чем разница между ними с точки зрения обновлений, внутренней структуры, производительности и т. Д.?
2 ответа
PersistentMapping
это просто реализация питона dict
тип (через стандартную библиотеку UserDict
базовый класс) с учетом семантики персистентности ZODB; это избавляет от необходимости устанавливать _p_changed
флаг ближайшего класса, который наследуется от Persistent
каждый раз, когда вы меняете mapping
,
Folder
это гораздо более богатый тип, реализующий события, интеграцию с веб-интерфейсом Zope (ZMI), произвольные свойства через Интернет (атрибуты с проверкой типа), управление разрешениями Zope, проверка идентификаторов подпунктов, импорт / экспорт и т. д. Папки подпунктов хранятся в виде атрибутов на самом объекте, а некоторые метаданные хранятся в частном тексте в экземпляре.
Использовать Folder
когда вам нужны какие-либо из этих дополнительных услуг (делегирование разрешений, проверка идентификатора и т. д.), используйте PersistentMapping
иначе. Производительность при поиске или хранении предметов не сильно отличается; один прямой питон dict
внизу, другой случай __dict__
хранение предметов.
Если вы ищете предотвращения конфликтов, вы должны посмотреть на BTrees, OOBTree
Класс - это в основном постоянное отображение, где значения хранятся в постоянных сегментах, избегая коллизий в большинстве случаев и обеспечивая разрешение конфликтов для остальных.
Если ты хочешь Folder
семантика с BTree
семантика хранилища, посмотрите на https://pypi.python.org/pypi/Products.BTreeFolder2 и надстройку, которая реализует Folder
интерфейсы, но хранит подобъекты в OOBTree
а не как атрибуты непосредственно на экземплярах.
PersistentDict (теперь называется PersistentMapping) - это класс, который наследуется от UserDict.IterableUserDict и persistent.Persistent.
UserDict.IterableUserDict - это встроенный класс Python, который имитирует итеративный словарь и persistent.Persistent - класс Zope, который позволяет сохранять свой экземпляр в ZODB.
Таким образом, PersistentDict (или PersistentMapping) - это, по сути, словарь, который можно сохранить как объект в ZODB.
Обычные словари не могут быть сохранены как отдельные объекты в ZODB. Они должны быть атрибутами некоторого класса, который наследуется от persistent.Persistent.
PersistentDict хранит свои ключи и значения внутри фактического словаря (атрибута данных).
PersistentDict не может быть добавлен через ZMI, и я думаю, что он предназначен в основном для особого случая, когда вы хотите хранить словарь непосредственно в zodb.
С папкой, я думаю, вы имеете в виду папку в zope.container.folder. Папка хранит свои дочерние элементы в объекте OOBTree, который является контейнером, который может содержать большое количество объектов.
Если вам нужен контейнер, содержащий экземпляры других типов контента, то вам лучше пойти с папкой.
Папка имеет интерфейсы, которых нет у PersistentDict, и эти интерфейсы могут потребоваться для работы определенных адаптеров или других компонентов. Например, событие ContainerModified будет срабатывать только при изменении папки, а не PersistentDict. Подобные ошибки могут быть разными, если вы используете PersistentDict в качестве папки общего назначения.
Когда дело доходит до производительности, словарь обычно будет работать быстрее, пока пространство клавиш не станет очень большим. Затем весы наклоняются к OOBTree.