我有一个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)
我已经阅读了所有文档,甚至查看了实现的内容,并不完全清楚这些操作对大型结果集的限制。
答案 0 :(得分:5)
地图一次读取批次,然后为批次中的每个实体调用回调。所以这应该没问题。您也可以尝试批量大小。
区别在于回调本身是否会执行更多IO。然后for循环版本可能等待每个项目被完全处理,而地图只是启动所有回调并且仅在最后等待它们。因此,更多的并行性,机器人也可能更多的内存使用。