3

App Engine(ndbまたはdb)でカウントを処理する適切な方法は何ですか?

django-nonrelと純粋なdjangoプロジェクトの2つのプロジェクトがありますが、どちらもクエリを取得してカウントを取り戻す機能が必要です。結果は1,000を超える可能性があります。

シャードカウンターを使用できるという投稿をいくつか見ましたが、それらはすべてのエンティティをカウントしています。次のプロパティを持つエンティティの数を知る必要がありますx=1、y = True、z = 3

#Is this the appropriate way?
count = some_entity.gql(query_string).count(SOME_LARGE_NUMBER)
4

2 に答える 2

5

データストアは、分散させることのトレードオフのため、この種のクエリには適していません。これらには、かなり遅い読み取りと非常に限られたインデックス作成が含まれます。

必要な統計のセットが限られている場合 (ユーザー数、記事数など)、別のエンティティで合計を実行し続けることができます。これは、何かが変更されたときに 2 つの書き込み (プット) を行う必要があることを意味します。1 つは変更されるエンティティ用で、もう 1 つは統計エンティティを更新するためです。ただし、統計情報を取得するために必要な read(get) は 1 つだけで、抽出されるエンティティの数は多くありません。

正規化について私たちが学んだことに反するため、これに不快感を覚えるかもしれませんが、はるかに効率的で、多くの場合うまく機能します。これが重要な場合は、cron ジョブで定期的にクエリを実行して、統計が正確であることを確認することができます。

于 2012-06-27T00:56:42.697 に答える
3

db.Modelを使用しているため、ハード リミットである 1000 を超える可能性があるいくつかのフィルターを使用してすべてのエンティティをカウントする方法の 1 つの方法を次に示します (まだ適用可能な場合)。

FETCH_LIMIT = 1000

def count_model(x=1, y=True, z=3):
  model_qry = MyModel.all(keys_only=True)
  model_qry.filter('x =', x)
  model_qry.filter('y =', y)
  model_qry.filter('z =', z)

  count = None
  total = 0
  cursor = None
  while count != 0:
    if cursor:
      count = model_qry.with_cursor(cursor).count()
    else:
      count = model_qry.count(limit=FETCH_LIMIT)

    total += count
    cursor = model_qry.cursor()
  return total

リクエストで上記を使用する場合は、タイムアウトになる可能性があるため、代わりにタスク キューの使用を検討してください。

また、FoxyLadが提案したように、パフォーマンス上の理由から、統計を完全に同期させるために定期的に実行されるcronジョブとして上記の方法を使用して、別のエンティティで合計を実行し続ける方がはるかに優れています.

于 2012-06-27T01:17:15.453 に答える