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ループバージョンは、おそらく各アイテムが完全に処理されるのを待ちますが、マップはすべてのコールバックを開始し、最後にそれらを待つだけです。したがって、並列処理が増えると、ボットはメモリの使用量も増える可能性があります。

于 2012-04-14T04:31:00.997 に答える