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

在作为 App Engine 数据存储区的 NoSQL 数据库上,计算 100000000 个实体是一项非常昂贵的操作。您可能希望在更新时计数,或者在事后运行 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)

当你创建一个新的消息对象时,你必须更新计数器,当你创建一个新消息时递增,或者如果你删除则递减。

在 GAE 上使用计数器的最佳方法是使用分片计数器

于 2013-03-07T02:14:49.170 回答
1

计数被实现为一个索引扫描,它丢弃除所见记录数之外的所有数据。它从不查找实体,因此实体的大小无关紧要。

话虽如此,在没有固定模式的系统中,这样的计数无法扩展并且成本很高。使用其他方法可能会更好,例如 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 回答