8

Java AppEngine用の新しい実験的なタスクキューを使用しており、データストア内の統計を集約するタスクを作成しようとしています。データストア内の(特定のタイプの)すべてのエンティティ内のUNIQUE値の数をカウントしようとしています。より具体的には、タイプXのエンティティにフィールドAがあるとします。データストア内のAの一意の値の数をカウントしたいと思います。

私の現在のアプローチは、タイプXの最初の10個のエンティティをクエリするタスクを作成し、Aの一意の値を格納するハッシュテーブルを作成してから、このハッシュテーブルをペイロードとして次のタスクに渡すことです。この次のタスクでは、すべてのエンティティを確認するまで、次の10個のエンティティなどをカウントします。最後のタスクの実行中に、ハッシュテーブル内のキーの数(タスクからタスクに渡されたもの)をカウントして、Aの一意の値の総数を見つけます。

これは、データストア内の少数のエンティティで機能します。しかし、一意の値がたくさんあると、このハッシュテーブルが大きくなりすぎるのではないかと心配しています。appengineタスクのペイロードの最大許容サイズはいくつですか?????

別のアプローチを提案できますか?

ありがとう。

4

3 に答える 3

14

ドキュメントによると、最大タスクオブジェクトサイズは100Kです。

于 2009-12-22T03:11:21.240 に答える
1

「別のアプローチを提案できますか?」

値に基づいてキーを作成し、を使用して、一意の値ごとにエンティティを作成しますModel.get_or_insert。次にQuery.count、通常のページングトリックを使用して、エンティティを1000のバッチ(またはリクエストがタイムアウトする前にカウントできる数-10以上)でアップします。

または、ドキュメントに記載されているコードと同様のコードを使用して、get_or_insertカウントを維持します-App Engineトランザクションは複数回実行される可能性があるため、トランザクションでインクリメントされたmemcachedカウントは信頼できません。ただし、これにはいくつかのトリックがある可能性があります。または、エンティティの親に対して不快なことをしていなければ、データストアにカウントを保持することができます。

于 2009-12-22T03:14:13.467 に答える
0

これは手遅れかもしれませんが、おそらくそれは役に立つかもしれません。まず、エンティティのセットを順番にウォークスルーする可能性がほとんどない場合は、インデックスが作成されたdate_createdまたはdate_modifiedauto_updateフィールドのいずれかを使用することをお勧めします。この時点から、TextPropertyを使用してモデルを作成し、json.dumps()を使用してハッシュテーブルを保存できます。あなたがする必要があるのは、最後に処理された日付とハッシュテーブルエンティティのモデルIDを渡すことだけです。最終日より後のdate_created、json_load()、TextPropertyを使用してクエリを実行し、次の10レコードを累積します。もう少し洗練されたものになる可能性があります(たとえば、渡されたパラメーターと少し異なるクエリアプローチを利用してdate_createdの衝突を処理します)。次のタスクに1秒のカウントダウンを追加して、ハッシュテーブルエンティティの更新が速すぎるという問題を回避します。HTH、-stevep

于 2013-11-22T01:10:29.290 に答える