0

Я пытаюсь перебрать огромное количество записей хранилища данных, в настоящее время около 330 000. Понятно, что каждая запись имеет строку, столбец и значение, и я повторяю записи и строю матрицу, которую я буду использовать для вычислений.Невозможно перебрать огромное количество записей DataStore

Ошибка, которую я получаю: Тайм-аут: время работы хранилища данных или данные временно недоступны.

[ADDED: УКАЗЫВАЙТЕ, что моя проблема не является таймаутом в приложении. Выполняя работу CRON, у меня много времени, и ошибка хранилища данных происходит быстрее, чем время автономной работы приложения. Кроме того, я попытался ответить на другие вопросы, как я упоминал ниже.]

Ошибка происходит после того, как итерация проходит менее 100 000 записей.

Мой текущий код, который я написал после консультации в прошлом связанные темы, является:

prodcauses_query = ProdCause.query(projection=['prod_id', 'value', 'cause']).filter(ProdCause.seller_id == seller_id) 
    for pc in prodcauses_query.iter(read_policy=ndb.EVENTUAL_CONSISTENCY, deadline=600): 
     ### COPY DATA IN RECORD PC INTO A MATRIX 
     ### row is prod_id, col is cause, value is value 

Есть ли лучший способ сделать это, чем ITER? Любые лучшие настройки для batch_size или крайнего срока или read_policy?

Обратите внимание, что этот процесс выполняется в задании CRON, поэтому меня это не беспокоит, если для этого требуется много времени. Остальная часть процесса занимает несколько секунд, жесткая часть читается в данных.

Спасибо за любые мысли!

+0

много существующие вопросы обложка это. DUP. –

+0

Возможный дубликат [Время ожидания Google App Engine?] (Http://stackoverflow.com/questions/7328582/google-app-engine-time-out) –

ответ

1

два варианта:

  • Использование MapReduce библиотека для App Engine задавить всех ваших лиц. А на карте часть MapReduce делайте волшебную вещь, которую вы хотите сделать на каждой из ваших сущностей. Учебное пособие можно найти здесь: MapReduce on App Engine made easy
  • Или используйте курсоры и задачу с ограниченным размером запроса. И.Е. ваше задание cron будет запускать первую партию или сущности, а если есть какие-либо остатки, она запустит другую задачу с помощью курсора запроса только что запущенного вами запроса.
1

Вы не сказали, если вы используете очередь задач, поэтому я предполагаю, что вы этого не сделали.

Задача cron должна начинаться с задачи, чтобы сделать вашу обработку другим, но обработчик все равно будет иметь 60-летний крайний срок. Выполнение этого задания даст вам 10-минутный срок.

Учитывайте размер партии, указав размеры больших партий, уменьшая количество круглых поездок.

И наконец, если задания выполняются в течение длительного времени, вы можете либо задавать задачи (смотреть, как долго вы запускаете, так и запускать новую задачу для продолжения), или просмотреть задания mapreduce.

+0

Задачи cron имеют тот же срок, что и задание. Тем не менее, запуск задачи для получения повторных попыток. – Greg

+0

Я пропустил увеличение лимита (кажется, что он только задокументирован в примечаниях к выпуску SDK 1.4, насколько я могу судить.) У меня всегда были задачи запуска cron, поскольку задачи повторяются, тогда как запросы cron - нет. –