Уведомления

Группа в Telegram: @pythonsu

#1 Март 15, 2017 11:15:06

legi0ner
От: Чебоксары
Зарегистрирован: 2012-05-15
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

djanfo mptt копирование 500 000 элементов

Всем привет.

Для работы с иерархической структурой использую django mptt.
Возникла проблема при копировании элементов. Так как тут не работает bulk create, не знаем будущего идентификатора объекта, приходиться создавать элементы в цикле.
Чем больше данных, тем больше времени, ресурсов используется.
Знаю, что нет 100% правильного решения. Может есть какие либо варианты с помощью которых можно ускорить работу копирования.

сейчас это выглядит упрощенно вот так

def copy_node(node, parent):
new_node = TreeStructure(
parent=parent
name=node.name
)
new_node.save()

for child in node.children.all():
self.copy_node(child, new_node)
return new_node


with transaction.atomic():
with TreeStructure.tree.delay_mptt_updates():
new_node = self.copy_node(node, parent)

Офлайн

#2 Март 16, 2017 11:03:46

scidam
Зарегистрирован: 2016-06-15
Сообщения: 288
Репутация: +  35  -
Профиль   Отправить e-mail  

djanfo mptt копирование 500 000 элементов

С большими объемами данных с mptt не работал, но он сохраняет структуру древовидную в обычной таблице со вспомогательными колонками lft, rght – которые и характеризуют положение элемента в иерархии. До конца, однако, задача мне не ясна, но если бы lft и rght можно вычислить заранее в вашей задаче, то можно использовать и bulk_create, чтобы сразу создать много записей в таблице…

Офлайн

#3 Апрель 3, 2017 12:53:42

code_ua
Зарегистрирован: 2016-05-30
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

djanfo mptt копирование 500 000 элементов

как вариант, во время такого копирования не использовать или отключить модель mptt, а потом перестроить ключи через rebuild() https://django-mptt.github.io/django-mptt/models.html#rebuild

Офлайн

#4 Апрель 3, 2017 12:55:59

code_ua
Зарегистрирован: 2016-05-30
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

djanfo mptt копирование 500 000 элементов

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version