2011-07-14 8 views
1

イベントに参加している人のためのアプリケーションを構築しています。特定のイベントに対して、PersonエンティティのサブセットのTicketエンティティを作成する必要があります。人の量は5万人を超えることがあります。多くのエンティティを作成するAppEngineタスク

もちろん、Forループを実行してPersonクエリを反復してこれらのTicketを生成することはできません。

これをApp Engineでどのように構造化すればよいですか?MapReduceを利用する方法はありますか?

+0

MapReduceでは、すべてのPersonエンティティをマッピングし、イベントに参加しているかどうかを確認してから、チケットを作成します。しかし、このイベントに参加している人がPersonセット全体の1%未満であれば、これは非常に効率的ではありませんか? – Nikolaj

答えて

1

Deferred libraryをご覧ください。 parrallelで複数のタスクキューをスプールして、必要な作業を行うことができます。 GoogleドキュメントのMapper example classを見てみると、適切な方向に進むのに役立ちます。

+0

私はMapperクラスのようなものを使うことを考えました。私の唯一の関心事は、処理が連続して行われるということです。実行するエンティティが100万人の場合、ジョブは永遠に実行されます。 – Nikolaj

+0

これは確かに長時間実行されますが、遅延タスクは、そのタイムスロットが使い果たされて次のアイテムを再キューできるときに例外を取得します。また、データセットに対して作業する多くの遅延タスクを開始し、タスクの一部(開始点と終了点)として分離データを渡し、それぞれをそのチャンクに対してのみ反復させることもできます。そうすれば、あなたの仕事量をスライスしてダイスすることになります – Wolfwyrd

+1

イベントに参加している人は100万人で、データベースの1%未満です...おめでとうございます。 –

1

要求が長く続くことができるバックエンドであれば、1つのforループで反復することができます。しかし、そのような長い実行プロセスは、私の意見では良いことではありません。私はタスクキューの適切な使用は十分以上だと思います。

私はDeferredライブラリについて読んでいます。時々それは奇妙な動作をし、あなたのデータを酸洗することはいくつかの頭痛を招くことがあります。私はTaskQueue APIのためにできる

0

Deferred Library私はコードを書くのは非常に簡単ですが、デメリットはあなたのデータをpickleし、それを1つのエンティティに入れ、後で読み込んでそれをアンピクルすることですオーバーヘッド。 30Kエンティティのコストは約3 CPU時間

最も安い wayは、人やエンキューをキーやその他の位置情報で分割したTask Queueを使用しています。 1 CPU時間が未満の同じ30Kエンティティを挿入します。

あなたの質問では、100万のエンティティをフェッチし、GAEの設計に応じて非常に高速で実行できます。最も遅い部分は、新しいTicketエンティティを格納することです。

BTW、 なぜPerson.all().filter("something like attending events")ではないのですか。

関連する問題