Как замедлить итерацию объекта генератора, извлекающего данные из веб-сервиса? - PullRequest
0 голосов
/ 29 января 2011

Я использую модуль Freebase-Python для перебора сотен результатов. Использование:

results = freebase.mqlreaditer(query, extended=True) 

У меня есть генератор Python, который я могу перебрать, вот так:

for r in results:
   #do stuff, like create new object and save to datastore

mqlreaditer () извлекает результаты JSON по 100 одновременно. Одна запись в этом результате 100 является короткой строкой вроде:

result:: {u'type': u'/games/game', u'mid': u'/m/0dgf58f', u'key': 
          {u'namespace': u'/user/pak21/', u'value': u'42617'}}

Я локально сталкиваюсь с ошибкой:

"WARNING  2011-01-29 15:59:48,383 recording.py:365] 
 Full proto too large to save, cleared variables."

Не уверен, что происходит, но я подозреваю, что это слишком слишком быстро, поэтому я хочу замедлить итерацию ИЛИ разбить ее на куски. Я не уверен, как работают генераторы или каков мой выбор. Обратите внимание, что это работает в Google App Engine, поэтому применяются зависимости Python и особенности использования локальной панели запуска механизма приложений.

1 Ответ

1 голос
/ 29 января 2011

Генератор - это просто функция, которая выглядит как последовательность, но которая извлекает элементы по одному для вас вместо того, чтобы иметь весь список данных заранее, что часто требует гораздо больше памяти. Это итерация «точно в срок», если хотите. Но у вас нет никаких гарантий относительно того, сколько данных он читает или кэширует, чтобы сделать это. Иногда он вполне может иметь полные данные - вы просто не знаете, не глядя на документы или код.

Если это действительно вопрос скорости, то выполнение import time и добавление вызова, такого как time.sleep(1.0) внутри цикла, будет каждый раз задерживать его на секунду: но я подозреваю, что на самом деле проблема не в этом, ни то, что решение должно быть. Возможно, ваш запрос извлекает слишком много данных или объекты слишком велики?

...