Наиболее эффективный способ получить, модифицировать и поместить пакет объектов с ndb

В моем приложении у меня есть несколько пакетных операций, которые я выполняю. к сожалению, это иногда требует навсегда обновления 400-500 объектов. что у меня есть все ключи сущностей, мне нужно получить их, обновить свойство и сохранить их в хранилище данных, и их сохранение может занять до 40-50 секунд, что не то, что они ищут.

плохо упростить мою модель, чтобы объяснить, что я делаю (что довольно просто):

class Entity(ndb.Model):
    title = ndb.StringProperty()

keys = [key1, key2, key3, key4, ..., key500]

entities = ndb.get_multi(keys)

for e in entities:  
    e.title = 'the new title'

ndb.put_multi(entities)

Получение и изменение не занимает слишком много времени. Я пытался получить get_async в тасклете и все, что еще возможно, что только меняется, если get или forloop занимает больше времени.

но меня действительно беспокоит то, что посылка занимает до 50 секунд...

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

Ответ 1

Интересно, делают ли небольшие партии, например. 50 или 100 объектов будут быстрее. Если вы сделаете это в задаче, попробуйте одновременно запустить эти тасклеты.

Я также рекомендую посмотреть на это с помощью Appstats, чтобы увидеть, показывает ли это что-то удивительное.

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

Ответ 2

Похоже на то, для чего был разработан MapReduce. Вы можете сделать это быстро, одновременно получая и изменяя все объекты одновременно, масштабируя несколько экземпляров сервера. Однако ваши затраты увеличиваются, используя больше экземпляров.

Ответ 3

Я предполагаю, что у вас есть дизайн сущности, который вы хотите (т.е. я не буду спрашивать вас, что вы пытаетесь сделать, и как, возможно, у вас должна быть одна большая сущность, а не кучка небольших которые вы должны обновлять все время). Потому что это было бы не очень приятно. (=

Что делать, если вы использовали очередь задач? Вы могли бы создать несколько задач, и каждая задача могла бы выполняться по мере того, как URL-адрес изменяет ключи, которые он отвечает за обновление, и свойства и значение, которые должны быть установлены. Таким образом, работа разбивается на управляемые куски, и пользовательский запрос может немедленно возвращаться, когда работа происходит в фоновом режиме? Будет ли это работать?