当查询结果的数量很大时,使用qry.map_async()是否安全?

时间:2012-04-13 19:06:38

标签: google-app-engine app-engine-ndb

我有一个AppEngine cron作业查询数据存储区,然后需要对查询返回的每个实体进行一些工作。预计查询返回的实体数量有时会很大(> 1000)。

我的目标是最大化并发性并保持较低的内存使用率 - 因为预期的结果数量很大,它们可能不适合内存。

考虑到大量的结果,我应该像这样迭代它们:

qry = Model.query()
qit = qry.iter()
while (yield qit.has_next_async()):
    entity = qit.next()
    # Do something with entity

...或者使用更快的map_async()来操作任意大的结果集是否安全?

@ndb.tasklet
def callback(entity):
    # Do something with entity

qry = Model.query()
yield qry.map_async(callback)

我已经阅读了所有文档,甚至查看了实现的内容,并不完全清楚这些操作对大型结果集的限制。

1 个答案:

答案 0 :(得分:5)

地图一次读取批次,然后为批次中的每个实体调用回调。所以这应该没问题。您也可以尝试批量大小。

区别在于回调本身是否会执行更多IO。然后for循环版本可能等待每个项目被完全处理,而地图只是启动所有回调并且仅在最后等待它们。因此,更多的并行性,机器人也可能更多的内存使用。