0

エンティティをカウントするためだけに種類が必要かどうか疑問に思っています。

例えば以下のようなモデルがあります。

class Message(db.Model):
    title = db.StringProperty()
    message = db.StringProperty()
    created_on = db.DateTimeProperty()
    created_by = db.ReferenceProperty(User)
    category = db.StringProperty()

そして、このモデルで作られた 100000000 個のエンティティがあります。
カテゴリが「本」に等しいエンティティをカウントしたい。
この場合、次のように数えるためのモードを作成する必要がありますか?

class Category(db.Model):
    category = db.StringProperty()
    look_message = db.ReferenceProperty(Message)

この小さなモデルはカウントを速くしますか?
そして、それはより小さなメモリを消去しますか?

ちなみに以下のように数えようと思っています

q = db.Query(Message).filter('category =', 'book')
count = q.count(10000)
4

3 に答える 3

2

100000000 個のエンティティをカウントすることは、App Engine データストアとしての NoSQL データベースで非常にコストのかかる操作です。おそらく、更新時にカウントするか、map-reduce 操作を実行して事後にカウントすることをお勧めします。

App Engine には、各タイプのエンティティの数を簡単に照会する方法も用意されています。

https://developers.google.com/appengine/docs/python/datastore/stats

たとえば、すべてのメッセージをカウントするには:

from google.appengine.ext.db import stats

kind_stats = stats.KindStat().all().filter("kind_name =", "Message").get()
count = kind_stats.count

統計は非同期で更新されるため、実際のカウントよりも遅れることに注意してください。

于 2013-05-21T01:08:19.910 に答える
1

このような別のエンティティを作成する必要があると思います。このエンティティは、カテゴリ別にメッセージ数をカウントするだけです。カテゴリを次のように変更してください。

class Category(db.model):
   category = db.StringProperty()
   totalOfMessages = db.IntegerProperty(default=0)

カテゴリ クラスを参照するように変更するメッセージ クラスで、カテゴリ プロパティを次のように変更するだけです。

category = db.ReferenceProperty(Category)

新しい Message オブジェクトを作成するときは、カウンターを更新する必要があります。新しいメッセージを作成するときはインクリメントし、削除する場合はデクリメントします。

GAE でカウンターを操作する最良の方法は、シャーディング カウンターを使用することです

于 2013-03-07T02:14:49.170 に答える
1

Count は、表示されたレコード数を除くすべてのデータを破棄するインデックス スキャンとして実装されます。エンティティを検索することはないため、エンティティのサイズは問題になりません。

そうは言っても、このようなカウントはスケーリングされず、固定スキーマのないシステムでは非常にコストがかかります。Sharded Counter、MapReduce、Materialized View/Fork Join などの別の方法を使用することをお勧めします。本当にスケーリングが必要な場合は、この講演が非常に有益です: http://www.google.com/events/io/2010/sessions/high-throughput-data-pipelines-appengine.html

于 2013-05-21T14:05:56.020 に答える