0

私は自分のアプリに NDB を使用し、 iter() を制限付きで使用し、カーソルを開始して、タスクで 20,000 件のクエリ結果を反復処理します。多くの場合、タイムアウト エラーが発生します。

タイムアウト: データストア操作がタイムアウトしたか、データが一時的に利用できませんでした。

私が電話をかける方法は次のようなものです。

results = query.iter(limit=20000, start_cursor=cursor, produce_cursors=True)
for item in results:
  process(item)
save_cursor_for_next_time(results.cursor_after().urlsafe())

制限を減らすことはできますが、タスクは 10 分も実行できると思いました。20000 件の結果を処理するには、10 分で十分です。実際、うまくいけば、タスクは約 1 分で完了します。

fetch() または fetch_page() に切り替えた場合、それらはより効率的になり、タイムアウト エラーが発生する可能性が低くなりますか? タイムアウト エラーの原因となる iter() には多くのオーバーヘッドがあると思われます。

ありがとう。

4

3 に答える 3

1

取得するエンティティの数が事前にわかっていない限り、フェッチは実際にはそれほど効率的ではありません。それらはすべて同じメカニズムを使用します。その後、フェッチは 1 回のラウンド トリップで済むため、より効率的になります。

iter のバッチサイズを大きくすることで、改善することができます。https://developers.google.com/appengine/docs/python/ndb/queryclass#kwdargs_optionsを参照して ください

ドキュメントによると、デフォルトのバッチ サイズは 20 です。これは、20,000 エンティティの場合、大量のバッチを意味します。

役立つ他のもの。process(entity) を明示的に呼び出すのではなく、処理で map や map_async を使用することを検討して くださいhttps://developers.google.com/appengine/docs/python/ndb/queries#map並行性の向上。

以上のことをすべて言ったので、時間がどこで使われているかを理解できるようにプロファイルする必要があります。たとえば、processあなたがそこで行っていることが原因で遅延が発生する可能性があります。

于 2013-07-24T01:02:40.847 に答える