2009-05-25 11 views
1

これはGoogle App Engineに適用されますが、必ずしもそれに制約されるものではありません。App Engineに適用される配賦(およびパーセンタイル)の償却を償却する?

Google App Engineでは、データベースはリレーショナルではないため、集計関数(合計、平均など)は実装できません。各行は互いに独立しています。合計と平均を計算するには、データベースに書き込む個々の書き込みごとに再計算し、常に最新の状態になるように計算を単純に償却する必要があります。

パーセンタイルと頻度分布(つまり密度)の計算方法について教えてください。私は、値のフィールドの密度のグラフを作成したいと思います。この値のセットはおそらく数百万のオーダーです。データセット全体をループすることができます(各クエリの制限は返されます)。それに基づいて計算されますが、私はむしろスマートなアプローチをとっています。

ある期間にわたって計算できる密度/頻度/百分位数分布を計算または近似するアルゴリズムがありますか?

ちなみに、データは、最大値と最小値がすべての場所にある可能性があるため不確定です。したがって、配布はデータの約95%を占め、それに基づいて密度のみを行う必要があります。

答えて

0

データセット全体(各クエリの制限は返された1000行です)をループすることは可能かもしれません。それに基づいて計算しますが、私はむしろいくつかスマートなアプローチをとっています。

これは私にとって最も明白なアプローチです。なぜあなたはそれを避けようとしていますか?

+2

GAEは、処理に要する時間とデータストアのCPU時間を制限します。すべてがhttpリクエストとして行われるため、リクエストごとにチャーンできるデータは非常に限られています。大規模な仕事を複数の業務に分け、結果を組み合わせるのは、より簡単なアプローチがあれば面倒です。 –

2

行ごとに1つの番号を取得するために、行全体を(1度に1000という制限で)繰り返し取得することは、魅力的ではありません。したがって、数字のリストを保持する別のエンティティにその単一の数値を記録することでデータを非正規化します(1つのクエリにつき1 MBと考えるので、4バイトの数値はリストあたり250,000を超えないようにしてください)。

したがって、数値を追加するときに最新の「追加データ値リスト」エンティティもフェッチしてください。完全に新しいものを作成する場合は、新しい数値を追加して保存してください。あなたが暗示しているように、統計上の小さなエラーがキラーでない場合、おそらくトランザクショナルになる必要はありません。

アイテムのデータを変更することができる場合は、「削除された」データ値を記録する同じ種類の別個のエンティティを持つことができます。 1つのアイテムの値を23から45に変更するには、最新の「削除された値」リストに23を追加し、最新の「追加された値」に45を追加します。

+0

それは何をするのですか?各番号の行の代わりに、私は今25万の行の行を持っています。どのように使えますか? 私がチェリーを1000個の数字ごとに選ぶと、それが働くかもしれないと思うようになりました。それでは、計算を実行するのに十分小さい統計的に関連するサンプルが得られます... –

+1

250kの数字ごとに1つのエンティティ、 1000行内には2億5,000万の数字を持つことができます。 「この値のセットはおそらく何百万というオーダーである」と言いますが、1つのクエリで関連するデータをフェッチして、必要な処理を実行できます(スライスを超える場合CPU時間のうち、作業自体を妥当な増分でスライスします)。 –

+0

ああ、意味があります。私はこの可能性を持って周り遊ぶ必要があります。ありがとう。 –

関連する問題