5

管理者だけが見ることができるユーザーのリストがあります(=読み取りが少ない)。このリストには、データストア内のユーザー数のカウントも表示されます。リストが1000を超える可能性があるため、最初に考えたのは、通常のcount()を避け、代わりにシャードカウンターを使用することでした。

ただし、問題は、管理者が男性/女性ユーザーのみを表示するなど、さまざまな検索フィルター(GUI内)にもアクセスできることです。カウントがこれらのフィルターを反映していることが重要です。これにより、女性ユーザー、男性ユーザー、およびその他の無数の組み合わせの数を取得できます。

このため、シャーディングされたカウンターとシャーディングされていない高同時実行カウンターは、検索フィルターのすべての組み合わせに対してカウンターを作成する必要があるため、良い考えとは思えません。

ここで説明するように、単にcount()メソッドのループを作成する必要がありますか、それともこれは非常に悪い習慣ですか?それ以外の場合はどうすればよいですか?

このカウンターは管理インターフェース用であり、読み取り回数が非常に限られていることに注意してください。これは、柔軟性と正確性のために読み取りパフォーマンスをいくらか犠牲にしたい場合です。1000を超えて成長できるはずですが、10000を超えて成長することは期待されていません。

4

2 に答える 2

2

私は2つのアプローチを試しました:

1)エンティティの固定制限(たとえば50)でデータストア(クエリはキー降順クエリ)をクエリする独自のタスクを作成します。次に、次のタスクをキューに入れ、中断したところからクエリを開始します。各タスクは次のタスクをキューに入れ、2 つのパラメーターを渡します (カーソルのように最後に中断した場所と、それが見たエンティティの数の現在の合計)。

2) このアプローチははるかに簡単です。それは、Google が appengine に提供する mapreduce ライブラリを使用することです。完全にユーザー空間で実行されるため、ライブラリをダウンロードしてビルドし、プロジェクトに含めるだけです。基本的に、指定したすべてのエンティティの反復処理を処理し、各エンティティで何を行うか (カウンターのインクリメントなど) のハンドラーを記述できるようにします。詳細については、mapreduce.appspot.com を参照してください。必要な機能を備えたサンプル アプリもあります。これに関する唯一の問題は、結果がブラウザに表示され、自分で行わない限り、必ずしもデータストアに保存されるとは限らないことです。

于 2010-06-29T04:05:47.740 に答える
2

「カウントのループ」は遅いですが、最近ではカーソルを使用して少し改善できます。通常、必要なすべての「フィルター処理された」カウンターに非正規化することをお勧めしますが、それによりユーザーの追加と削除が遅くなります (おそらく人口統計の変化も同様です)。したがって、読み取り量が非常に少ない特定のユースケースを考えると、おそらく「カウントのループ」アプローチ(およびカーソル;-)を回避します。

于 2010-06-29T00:34:51.977 に答える