Google App Engine: эффективное удаление больших файлов (около 90000 в день) - PullRequest
3 голосов
/ 07 августа 2011

У меня есть приложение, которое имеет только одну модель с двумя свойствами StringProperties.

Начальное количество объектов составляет около 100 миллионов (я буду загружать их с помощью массового загрузчика).

Каждые 24часов я должен удалить около 70000 сущностей и добавить 100000 сущностей.Мой вопрос сейчас: каков наилучший способ удаления этих объектов?

Есть ли способ избежать выборки объекта перед его удалением?Мне не удалось найти способ сделать что-то вроде:

DELETE from xxx WHERE foo1 IN ('bar1', 'bar2', 'bar3', ...)

Я понимаю, что ядро ​​приложения предлагает предложение IN (хотя и с максимальной длиной 30 (из-за максимального количества отдельных запросов на один запрос GQL) 1 )), но для меня это все еще кажется странным, поскольку мне придется получить x-сущности, а затем удалить их снова (делая два вызова RPC для каждой сущности).

Примечание: сущностьследует игнорировать, если не найден.

РЕДАКТИРОВАТЬ: Добавлена ​​информация о проблеме

Эти объекты являются просто доменами.Первая строка - это SLD, а вторая - TLD (без поддоменов).Приложение может быть использовано для предварительной обработки запроса, например: http://[. ..] / available / stackoverflow.com.Приложение вернет истинный / ложный объект json.

Почему у меня так много сущностей?Потому что хранилище данных содержит все зарегистрированные домены (пока что .com).Я не могу выполнить запрос whois в каждом случае из-за TOS и задержки.Поэтому я сначала заполняю хранилище данных целым файлом зоны, а затем ежедневно добавляю / удаляю домены, которые были зарегистрированы / удалены ... Проблема в том, что это довольно большие количества, и мне нужно найти способ снизить затратыи добавьте / удалите 2 * ~ 100000 доменов в день.

Примечание: вычисления вряд ли будут выполняться, поскольку запрос доступности просто проверяет, существует ли домен в хранилище данных!

1 : «Для каждого отдельного запроса GQL допускается не более 30 запросов к хранилищу данных».(http://code.google.com/appengine/docs/python/datastore/gqlreference.html)

Ответы [ 2 ]

2 голосов
/ 07 августа 2011

Если вы этого еще не сделали, вы должны использовать для этого key_names.

Вам понадобится модель типа:

class UnavailableDomain(db.Model):
    pass

Тогда вы будете заполнять свое хранилище данных как:

UnavailableDomain.get_or_insert(key_name='stackoverflow.com')
UnavailableDomain.get_or_insert(key_name='google.com')

Затем вы будете запрашивать доступные домены с чем-то вроде:

is_available = UnavailableDomain.get_by_key_name('stackoverflow.com') is None

Затем, когда вам нужно удалить несколько доменов, потому что они стали доступны, вы можете создатьбольшой список ключей без необходимости сначала запрашивать базу данных, например:

free_domains = ['stackoverflow.com', 'monkey.com']
db.delete(db.Key.from_path('UnavailableDomain', name) for name in free_domains)

Я все равно рекомендовал бы группировать удаления примерно до 200 за RPC, если ваш список free_domains действительно большой

0 голосов
/ 07 августа 2011

рассматривали ли вы библиотеку appengine-mapreduce . Он поставляется с библиотекой конвейера, и вы можете использовать оба для:

  • Создайте конвейер для общей задачи, которую вы будете запускать через cron каждые 24 часа
  • "Общий" конвейер запустит маппер, который отфильтрует ваши сущности и выдаст операции удаления
  • после завершения удаления сопоставления конвейер 'total' может вызвать конвейер 'import', чтобы начать выполнение вашей части создания сущности.
  • pipe api может затем отправить вам электронное письмо, чтобы сообщить о его статусе
...