谷歌应用引擎计数

2024-10-01 09:35:35 发布

您现在位置:Python中文网/ 问答频道 /正文

在app engine(ndb或db)中处理计数的适当方法是什么?在

我有两个项目,一个是django nonrl,另一个是纯django项目,但两者都需要接受查询和进行倒数的能力。结果可能超过1000。在

我看到一些帖子说我可以使用Sharded Counters,但他们正在计算所有实体。我需要知道有多少实体具有以下性质x=1,y=True,z=3

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

Tags: 项目django方法实体appdbcount能力
2条回答

数据存储不擅长这种查询,因为需要权衡才能使其分布式。其中包括相当慢的读取,以及非常有限的索引。在

如果您需要有限的统计数据集(用户数、文章数等),那么您可以在单独的实体中继续运行合计。这意味着您需要在发生更改时执行两次写入(put):一次用于更改的实体,另一次用于更新stats实体。但是您只需要一次read(get)就可以得到统计信息,而不是从中提取出多少个实体。在

你可能会对此感到不安,因为它违背了我们对正常化的认识,但它的效率要高得多,而且在很多情况下都很好。如果这很关键的话,您可以始终让cron作业定期执行查询,以检查统计数据是否准确。在

由于您使用的是db.Model,这里有一种方法可以告诉您如何使用可能超过1000的过滤器来计算所有实体,这是一个硬限制(如果它仍然适用):

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

如果您要在请求中使用上述方法,那么您可能会超时,所以考虑使用Task Queues。在

同样,正如FoxyLad提议的那样,出于性能原因,最好将totals保存在一个单独的实体中,并将上述方法作为cron作业定期运行,以使统计数据完全同步。在

相关问题 更多 >