我想对特定类型的所有实体执行小操作,并将它们重写到数据存储区。我目前有20,000个此类实体,但想要一个可以扩展到任何数量的解决方案。
我有什么选择?
答案 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!')