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

Jon*_* G. 1 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
Run Code Online (Sandbox Code Playgroud)

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

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

qry = Model.query()
yield qry.map_async(callback)
Run Code Online (Sandbox Code Playgroud)

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

Gui*_*sum 5

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

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