【问题标题】:Should the size of entities be as small as possible when I count them by "count()" method?当我通过“count()”方法计算实体时,实体的大小是否应该尽可能小?
【发布时间】:2013-03-06 14:43:43
【问题描述】:

我想知道我是否应该有一个只用于计算实体的种类。

例如 有一个类似下面的模型。

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)

【问题讨论】:

  • 我认为您应该重新表述您的问题并添加一些代码。你的期望是什么 你期望的结果是什么。
  • 感谢您的建议
  • 我不认为模型大小会影响 count()
  • 我从未见过 count() 文档中引用过它(大小)。
  • 我认为 count() 只是遍历索引和计数,它实际上并没有获取实体。这反映在成本上,因为 count() 需要一个小操作而不是完整的读取操作。

标签: google-app-engine google-cloud-datastore


【解决方案1】:

在作为 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

请注意,统计数据是异步更新的,因此它们会滞后于实际计数。

【讨论】:

  • 感谢您提供的有益信息。我不知道那种“统计数据”。现在我知道我不必执行计数循环来计算一种类型的所有实体。
【解决方案2】:

我认为您必须创建另一个这样的实体。 这个实体只会按类别计算消息的数量。 只需将您的类别更改为:

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

在你改成引用category类的message类中,把category属性改成:

category = db.ReferenceProperty(Category)

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

在 GAE 上使用计数器的最佳方法是使用 Sharding Counters

【讨论】:

    【解决方案3】:

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

    话虽如此,在没有固定模式的系统中,这样的计数无法扩展并且成本非常高。使用其他方法可能会更好,例如 Sharded Counter、MapReduce 或 Materialized View/Fork Join。如果你真的想扩大规模,这个演讲内容非常丰富:http://www.google.com/events/io/2010/sessions/high-throughput-data-pipelines-appengine.html

    【讨论】:

      猜你喜欢
      • 2018-04-29
      • 1970-01-01
      • 1970-01-01
      • 2021-03-07
      • 2016-02-12
      • 2012-10-10
      • 2014-12-06
      • 1970-01-01
      相关资源
      最近更新 更多