イベントに参加している人のためのアプリケーションを構築しています。特定のイベントに対して、PersonエンティティのサブセットのTicketエンティティを作成する必要があります。人の量は5万人を超えることがあります。多くのエンティティを作成するAppEngineタスク
もちろん、Forループを実行してPersonクエリを反復してこれらのTicketを生成することはできません。
これをApp Engineでどのように構造化すればよいですか?MapReduceを利用する方法はありますか?
イベントに参加している人のためのアプリケーションを構築しています。特定のイベントに対して、PersonエンティティのサブセットのTicketエンティティを作成する必要があります。人の量は5万人を超えることがあります。多くのエンティティを作成するAppEngineタスク
もちろん、Forループを実行してPersonクエリを反復してこれらのTicketを生成することはできません。
これをApp Engineでどのように構造化すればよいですか?MapReduceを利用する方法はありますか?
Deferred libraryをご覧ください。 parrallelで複数のタスクキューをスプールして、必要な作業を行うことができます。 GoogleドキュメントのMapper example classを見てみると、適切な方向に進むのに役立ちます。
私はMapperクラスのようなものを使うことを考えました。私の唯一の関心事は、処理が連続して行われるということです。実行するエンティティが100万人の場合、ジョブは永遠に実行されます。 – Nikolaj
これは確かに長時間実行されますが、遅延タスクは、そのタイムスロットが使い果たされて次のアイテムを再キューできるときに例外を取得します。また、データセットに対して作業する多くの遅延タスクを開始し、タスクの一部(開始点と終了点)として分離データを渡し、それぞれをそのチャンクに対してのみ反復させることもできます。そうすれば、あなたの仕事量をスライスしてダイスすることになります – Wolfwyrd
イベントに参加している人は100万人で、データベースの1%未満です...おめでとうございます。 –
要求が長く続くことができるバックエンドであれば、1つのforループで反復することができます。しかし、そのような長い実行プロセスは、私の意見では良いことではありません。私はタスクキューの適切な使用は十分以上だと思います。
私はDeferredライブラリについて読んでいます。時々それは奇妙な動作をし、あなたのデータを酸洗することはいくつかの頭痛を招くことがあります。私はTaskQueue APIのためにできる
Deferred Library私はコードを書くのは非常に簡単ですが、デメリットはあなたのデータをpickleし、それを1つのエンティティに入れ、後で読み込んでそれをアンピクルすることですオーバーヘッド。 30Kエンティティのコストは約3 CPU時間!
最も安い wayは、人やエンキューをキーやその他の位置情報で分割したTask Queueを使用しています。 1 CPU時間が未満の同じ30Kエンティティを挿入します。
あなたの質問では、100万のエンティティをフェッチし、GAEの設計に応じて非常に高速で実行できます。最も遅い部分は、新しいTicketエンティティを格納することです。
BTW、 なぜPerson.all().filter("something like attending events")
ではないのですか。
MapReduceでは、すべてのPersonエンティティをマッピングし、イベントに参加しているかどうかを確認してから、チケットを作成します。しかし、このイベントに参加している人がPersonセット全体の1%未満であれば、これは非常に効率的ではありませんか? – Nikolaj