在Google App Engine上更新数据存储区中的大量实体

时间:2012-06-26 08:33:27

标签: python google-app-engine datastore

我想对特定类型的所有实体执行小操作,并将它们重写到数据存储区。我目前有20,000个此类实体,但想要一个可以扩展到任何数量的解决方案。

我有什么选择?

2 个答案:

答案 0 :(得分:4)

使用mapper - 这是MapReduce框架的一部分,但您只需要第一个组件map,因为如果您只是改变数据存储区实体,则不需要shuffle / reduce步骤。 / p>

答案 1 :(得分:3)

Daniel是正确的,但是如果您不想搞砸映射器,那么您需要在应用中添加另一个库,您可以使用Task Queues或使用{{3}更简单地执行此操作自SDK 1.2.3开始包含。

20.000个实体并不那么引人注目,我认为这个任务不会定期执行(但即使这样做,也是可行的)。

以下是使用deferred library和延迟库的示例(您可以使用DB轻松完成此操作,但如果您尚未使用它,请考虑切换到NDB)。这是一个非常直接的方式,但不关心超时:

def update_model(limit=1000):
  more_cursor = None
  more = True
  while more:
    model_dbs, more_cursor, more = Model.query().fetch_page(limit, start_cursor=more_cursor)
    for model_db in model_dbs:
      model_db.updated = True
    ndb.put_multi(model_dbs)
    logging.info('### %d entities were updated' % len(model_dbs))

class UpdateModelHandler(webapp2.RequestHandler):
  def get(self):
    deferred.defer(update_model, _queue='queue')
    self.response.headers['Content-Type'] = 'text/html'
    self.response.out.write('The task has been started!')