我想对特定类型的所有实体执行一个小操作并将它们重写到数据存储区。我目前有 20,000 个此类实体,但想要一个可以扩展到任意数量的解决方案。
我有哪些选择?
我想对特定类型的所有实体执行一个小操作并将它们重写到数据存储区。我目前有 20,000 个此类实体,但想要一个可以扩展到任意数量的解决方案。
我有哪些选择?
使用映射器- 这是 MapReduce 框架的一部分,但您只需要第一个组件 map,因为如果您只是改变数据存储实体,则不需要 shuffle/reduce 步骤。
Daniel 是正确的,但如果您不想弄乱映射器,这需要您向应用程序添加另一个库,您可以使用任务队列来完成,或者使用自 SDK 1.2.3 以来包含的延迟库更简单.
20.000 个实体并没有那么戏剧化,我认为这项任务不会定期执行(但即使这样做,也是可行的)。
这是一个使用NDB和延迟库的示例(您可以使用 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!')