1

我有一个 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)

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

4

1 回答 1

5

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

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

于 2012-04-14T04:31:00.997 回答