2

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 からデータ ダンプを取得し、それを処理することも可能かもしれません (ただし、サイズのため、最初の選択肢にはなりません)。

これを達成するための良い方法は何でしょうか? この問題を解決するより良い方法はありますか? これに関するアイデアは本当にありがたいです。

4

1 に答える 1

2

mapreduce フレームワークの機能をほぼ説明していると思います。

于 2012-11-30T07:44:43.207 に答える