Как лучше всего сократить время ЦП, используемое хранилищем данных

У меня есть задание cron, которое я запускаю каждые три минуты, которое извлекает некоторые данные из удаленного API, а затем сохраняет их в моем локальном хранилище данных. Однако это занимает огромное количество процессорного времени в операции размещения хранилища данных. Я подозреваю, что, вероятно, делаю что-то действительно глупое, что можно сильно оптимизировать:

result = urllib2.urlopen(url).read()
foos = json.loads(result)['foo']
bars = json.loads(result)['bar']

models = []
for foo in foos:
    d = FooContainer()
    d.Property = foo.Value #in real code, this is setting a load of values based off foo     
    models.append(d)

for bar in bars:
    d = BarContainer()
    d.Property = bar.Value #in real code, this is setting a load of properties based off bar
    models.append(d)

db.put(models)

Как видите, я сохраняю каждую часть данных, возвращенных как новую «строку» в таблицах моего локального хранилища данных. Есть ли какая-то техника, которую я могу использовать, чтобы уменьшить огромное время процессора хранилища данных, используемое этой задачей cron?


person Martin    schedule 17.05.2011    source источник
comment
Сколько сущностей вы сохраняете?   -  person systempuntoout    schedule 17.05.2011
comment
последняя работа сэкономила 217 фунтов и 137 баров. Большинство рабочих мест будут примерно одинакового размера   -  person Martin    schedule 17.05.2011


Ответы (3)


~ 2k cpu_ms выглядит примерно так. Вы видите 46k api cpu_ms, потому что хранилище данных может записывать только макс. 10 сущностей в секунду (регулируется API), и вы пишете более 450 сущностей, таким образом, 450+/10 составляет около 46 000 cpu_ms.

Использование api не учитывается непосредственно в нижней строке вашей квоты, учитываются только real ~2k. Так что не беспокойся об этом, ты в порядке.

person Travis Webb    schedule 17.05.2011
comment
Итак, хотя консоль appengine предупреждает меня, что я использую в среднем 59070 для каждого запуска этого задания cron, на самом деле это не имеет большого значения? - person Martin; 17.05.2011
comment
Обратите внимание, что в вашем выводе есть real и api. real засчитывается в вашу квоту. real — это фактическая работа процессора, измеренная в миллисекундах по сравнению с воображаемым процессором с частотой 1,2 ГГц (подробности об этом см. в документации appengine). Теперь, если вы обнаружите, что real составляет что-то вроде 59k+ cpu_ms, тогда у вас есть проблема, но вы только на ~2k, и это каждые 3 минуты, поэтому эта процедура будет использовать только небольшую часть вашей бесплатной квоты. - person Travis Webb; 17.05.2011

Ставка в порядке. На самом деле единственный способ сделать неверный пут — это использовать слишком много RPC. Вы уже используете только один.

Хранение ~400 сущностей в одном обработчике запросов будет дорогим. Если вы хотите оптимизировать, я бы спросил себя, действительно ли вам нужно хранить столько сущностей одновременно. Не могли бы вы запускать задание cron чаще и возвращать меньшие партии? Вам действительно нужна одна сущность на строку, или вы могли бы добиться того же самого с меньшим количеством сущностей и ListProperty? В вашем вопросе недостаточно контекста, чтобы дать действенный совет, но об этом следует подумать.

person Drew Sears    schedule 17.05.2011

Вы пытались использовать nice, чтобы быть добрым к другим процессам?

http://en.wikipedia.org/wiki/Nice_%28Unix%29

Кроме того, убедитесь, что вы делаете массовую вставку, но это так.

person Alexis    schedule 17.05.2011
comment
Применяется ли nice к appengine? - person Martin; 17.05.2011
comment
Движок приложения не имеет понятия о приятности. Ужасный ответ. - person Travis Webb; 17.05.2011