Google AppEngine のデータストアから行を取得する場合、エンティティ タイプのすべてのデータの取得を複数の同時プロセスで実装したいと考えています。プロセスは、バックエンドの Python サーバーで非同期に実行されます。ポイントは、次のように、各プロセスにデータセット全体の「チャンク」を取得させることです。これにより、負荷をすべてのプロセスにほぼ均等に分散できます。
|_____|_____|_____|_____|_____|_____|_____|.....|_____|_____|
p1 p2 p3 p4 p5 p6 p7 pk-1 pk
それぞれpn
がプロセスであり、すべてのエンティティが取得されます。
これを有効にする方法は、(Pythonで)次のように言うことだと思います:
chunk_size = num_entities / num_chunks
base_query = 'select * from entity offset %d limit %d'
for chunk in range(0, to = num_entities, step_by = chunk_size):
cursor = get_cursor(base_query, offset = chunk, limit = chunk_size)
while is_ready(cursor):
do_task_with_data(cursor.next())
get_cursor
指定されたオフセットから始まる結果からスクロールする AppEngine からカーソルを取得する場所。役立つ場合に備えてここに引数を含めていますが、たとえばlimit
、ループ内で強制することもできます。while
いずれにせよ、クエリが制限とオフセットを伴う O(n) ではない (つまり、データをフェッチする前に、最後のクエリでほぼすべてのデータをスクロールする必要がある) 状況を取得したいと考えています。
別のオプションは、chunk_num チャンクに分割された 0 -> 1 の範囲を使用して、いくつかのランダムな値 (私たちが持っている) に基づいてエンティティを配布することです。
どうにかして App Engine からデータ ダンプを取得し、それを処理することも可能かもしれません (ただし、サイズのため、最初の選択肢にはなりません)。
これを達成するための良い方法は何でしょうか? この問題を解決するより良い方法はありますか? これに関するアイデアは本当にありがたいです。