【发布时间】:2012-06-27 13:04:18
【问题描述】:
我想对特定种类的所有实体执行一个小操作,并将它们重写到数据存储区。我目前有 20,000 个此类实体,但想要一个可以扩展到任意数量的解决方案。
我有哪些选择?
【问题讨论】:
标签: python google-app-engine datastore
我想对特定种类的所有实体执行一个小操作,并将它们重写到数据存储区。我目前有 20,000 个此类实体,但想要一个可以扩展到任意数量的解决方案。
我有哪些选择?
【问题讨论】:
标签: python google-app-engine datastore
使用mapper - 这是 MapReduce 框架的一部分,但您只需要第一个组件 map,因为如果您只是改变数据存储实体,则不需要 shuffle/reduce 步骤。
【讨论】:
Daniel 是正确的,但如果您不想弄乱映射器,这需要您向应用程序添加另一个库,您可以使用 Task Queues 或更简单地使用包含的 deferred library从 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!')
【讨论】: