2013-05-03 2 views
2

У меня есть 1,6 миллиона объектов в приложении Google App Engine, которые я бы хотел скачать. Я попытался использовать встроенный механизм bulkloader, но обнаружил, что он очень медленный. Хотя я могу загружать ~ 30 сущностей в секунду через загрузчик, я могу сделать ~ 500 сущ./Сек, запросив хранилище данных через бэкэнд. Бэкэнд необходим, чтобы обойти 60-секундный предел запроса. Кроме того, запросы хранилища данных могут работать только до 30 секунд, поэтому вам нужно разбить свои выборки по нескольким запросам с помощью курсоров запросов.Массовая загрузка через Google App Engine Backend

код на стороне сервера получает 1000 объектов и возвращает курсор запроса:

cursor = request.get('cursor') 
devices = Pushdev.all() 

if (cursor and cursor!=''): 
    devices.with_cursor(cursor) 

next1000 = devices.fetch(1000) 

for d in next1000: 
    t = int(time.mktime(d.created.timetuple())) 
    response.out.write('%s/%s/%d\n'%(d.name,d.alias,t)) 

response.out.write(devices.cursor()) 

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

ПРОБЛЕМА: Я могу только получить долю - ~ 20% сущностей, используя этот метод. Я получаю ответ с пустыми данными, хотя полный набор объектов не был пройден. Почему этот метод не получает все всесторонне?

+0

Не могли бы вы ударять свой ежедневный бюджет от чтения опс? – Linuxios

+0

Nope. Это премиум-аккаунт. – er0

+0

Вы по-прежнему устанавливаете ежедневный бюджет того, сколько вы готовы заплатить. – Linuxios

ответ

2

Я не мог найти ничего, чтобы подтвердить или опровергнуть это в документации, но я думаю, что all() имеет недетерминированное порядок такой, что в конце концов один из ваших fetch(1000) «s ударит„последний элемент“и devices.cursor() будет ничего не возвращай.

Попробуйте это:

devices = Pushdev.all().order('__key__') 
+0

Так оно и было. Я еще не тестировал все еще. Будет делать и публиковать любые обновления. – er0

 Смежные вопросы

  • Нет связанных вопросов^_^