2011-10-31 8 views

答えて

2

0と1の間の乱数を、格納するときに各エンティティに割り当てます。ランダムなレコードを取得するには、0と1の間の別の乱数を生成し、ランダムな値を持つ最小のエンティティをクエリします。

+0

データを選択する目的のみでインデックスを作成しているようですが、残念なことですが、残念です。私のテーブルはまれにしか更新されないので、私はキーのリストをローカルにキャッシュし、無作為に1つを取得することを考えています(追加のカラム/インデックス/クエリを避ける)。 –

0

すべてを取得する必要はありません。例えば :

  1. countall =クエリ(X.class).count()// http://groups.google.com/group/objectify-appengine/browse_frm/thread/3678cf34bb15d34d/82298e615691d6c5?lnk=gst&q=count#82298e615691d6c5
  2. RND =乱数[0..countall]
  3. ofy.queryを生成し(X.class ).order( " - 日付")。制限(rnd); //例-dateまたは
  4. 最終idはあなたの...

改善(最初の読み取りが平均50%以下であるといけないので、あなたが50%をfatchかでの平均で)(にあるいくつかの慢性インデックスフィールドのためにキャッシュ内に小さなキーテーブルを持つ)!

まず、すべてのX要素を覚えておいてください。 キャッシュid-sとその位置。次回は、選択したIDからさらに条件を問い合わせます(max ".limit(rnd%X)"はX-1になります)。

100%公平に近い場合、慢性的なフィールド値を推測する必要がない場合はランダムです(たとえば、10日間で1000レコード、ランダム501選択で5日以上の第2要素を選択した場合) 。

慢性フィールドの日付(またはそれに類するもの)がある場合は、ランダムな日付より古い要素を取り込み、次にランダムな日付+1(最初の日付と最後の日付を知る必要があります)の要素を取得します。 2番目はフェッチされたレコード間のランダムを選択します。クエリが空の場合などより大きい...

0

は客体データストアからいくつかのランダムな要素を選択についてthis postからの引用を選択:

あなたのIDが連続している場合は、一つの方法は、ランダムに5つの 番号を選択することであろう使用中であることが知られているID範囲からのものです。次に、filter()内の "in"のクエリを使用します。

5つのエントリが隣接していても構わない場合は、count()、 limit()、およびoffset()を使用して5つのエントリのブロックをランダムに見つけることができます。

それ以外の場合は、 に一度に1つのエントリをランダムに選択するには、おそらくlimit()とoffset()を使用する必要があります。

- ジョシュ

0

私はかなりMatejcを提供するアルゴリズムを適応させます。しかし、3つの事:代わりに、カウント()またはデータストアサービス工場(DatastoreServiceFactory.getDatastoreServiceを())を使用しての

  1. 、私は私が興味を持ってエンティティの合計数を追跡エンティティを持っていますこのアプローチの理由は次のとおりです。 a。たくさんのオブジェクトを扱うときにcount()が高価になる可能性があります。 b。ローカルにデータストアサービスのファクトリをテストすることはできません... prodでテストするのは悪い習慣です。 。乱数生成

  2. :代わりに上限を()を使用してのThreadLocalRandom.current()nextLong(1、maxRange)

  3. は、私が使用してオフセットので、私はソート」を心配する必要はありません。 "

関連する問題