Насколько эффективен Google App Engine ndb.удалить мульти()?
Я работаю над тем, чтобы очистить мою базу данных от ~10 000 сущностей, и мой план состоит в том, чтобы поместить ее в задачу, которая удаляет 200 за один раз с помощью ndb.delete_multi()
, а затем рекурсивно вызывает себя снова, пока не останется никаких сущностей.
На данный момент у меня еще нет рекурсии, поэтому я могу запустить код несколько раз вручную и проверить наличие ошибок, использование квот и т. д. Код:
entities = MyModel.query_all(ndb.Key('MyModel', '*defaultMyModel')).fetch(200)
key_list = ndb.put_multi(entities)
ndb.delete_multi(key_list)
Все, что делает query_all()
, - это запрашивает MyModel и возвращает все.
Я провел некоторые испытания с помощью комментируя вещи и запуская метод, и похоже, что первые две строки занимают ожидаемое количество записей (~200).
Запуск третьей строки, ndb.delete_multi()
, занимает около 8% от моего ежедневного пособия на 50 000 записей, поэтому около 4000 записей-в 20 раз больше, чем я думаю, что это должно быть сделано.
Я также убедился,что key_list содержит только 200 ключей с регистрацией.
Есть идеи, почему это занимает так много времени? Я использую этот метод неправильно? Или он просто использует тонну память? В таком случае, есть ли у меня способ сделать это более эффективно?
Спасибо.
2 ответа:
Ваш пример кода крайне неэффективен. Если вы удаляете большое количество сущностей, чем вам нужно будет паковать ниже, но, вы должны получить данные с помощью запроса keys_only, а затем удалить:
from google.appengine.ext import ndb ndb.delete_multi( MyModel.query().fetch(keys_only=True) )
Что касается количества операций записи (см. ответ Андрея), убедитесь, что только поля в вашей модели, которые должны быть проиндексированы, "имеют включенный индекс".