Вы можете использовать любой неизменный объект python в качестве ключа внутри BTree, и скорость на самом деле не зависит от этого. То, что, кажется, замедляет вещи, является моей попыткой индексации, которая требует многократных операций записи для работы. Как я упоминал выше @Blackmoon, я только что обнаружил repoze.catalog и постараюсь сообщить о любом прогрессе.

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

Первоначально, когда я добавлял объект в базу данных, я вставлял его в ветку, посвященную этому типу объекта. Чтобы предотвратить несколько объектов, представляющих одну и ту же сущность, я добавил метод, который будет перебирать существующие объекты в ветви, чтобы найти дубликаты. Сначала это работало, но по мере увеличения размера базы данных время, необходимое для загрузки каждого объекта в память и проверки атрибутов, росло экспоненциально и недопустимо.

Чтобы решить эту проблему, я начал создавать индексы на основе атрибутов объекта, чтобы при добавлении объекта он сохранялся как в ветви типа, так и в ветви индекса значения атрибута. Например, допустим, что я сохранял объект person с атрибутами firstName = 'John' и lastName = 'Smith', объект добавлялся к ветви типа объекта person и также добавлялся к спискам в пределах ветви индекса атрибута с ключами ' Джон и Смит.

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

Тем не менее, я быстро столкнулся с другой проблемой, касающейся действий при обновлении объектов. Индексы необходимо будет обновить, чтобы отразить тот факт, что они могут быть неточными. Это требует либо запоминания старых значений, чтобы к ним можно было напрямую получить доступ к объекту, и удаления объекта, либо итерации по всем значениям типа атрибута, чтобы найти, а затем удалить объект. В любом случае производительность быстро начинает ухудшаться, и я не могу найти способ ее решить.

У вас были такие проблемы раньше? Что вы решили, или это просто то, с чем мне приходится сталкиваться при использовании OODBMS?

Заранее благодарю за помощь.

Ответы на вопрос(1)

Ваш ответ на вопрос