需要一种方法来计算GAE数据存储中满足特定条件的实体吗? (超过1000个实体)

时间:2010-02-04 17:02:37

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

我正在GAE上构建一个需要报告发生事件的应用程序。一个事件有一个类型,我还需要按事件类型报告。

例如,假设存在事件A,B和C.它们是随机发生的。用户登录并创建一组可以归因于这些事件的实体。当用户回来检查状态时,我需要能够告知在特定时间范围(例如一天或一个月)内发生了多少A,B和/或C事件。

1000限制正在扼杀我通常如何做到这一点。我不需要检索所有实体并将它们呈现给用户,但我需要显示特定日期范围的总计数。有什么建议吗?

我有点像python / GAE noob ...

6 个答案:

答案 0 :(得分:7)

App Engine不是关系数据库,您无法像这样快速进行计数。最好的方法是在写入时更新计数,而不是在读取时生成它们。

生成计数时,有两种通用方法可以很好地扩展App Engine以最大限度地减少写入争用:

  1. 将计数存储在Memcache或本地内存中并定期刷新。这是最简单的解决方案,但它可能是易失性的,并且可能会丢失数据。
  2. 使用Sharded Counter。这种方法更可靠但更复杂。您将无法通过计数轻松排序,但您也可以定期刷新到另一个索引计数字段并按此排序。

答案 1 :(得分:3)

  

数据存储计数()查询的结果   和所有数据存储区查询的偏移量   不再限制在1000。

自版本1.3.6起

答案 2 :(得分:0)

我的方法是建立一个或多个聚合模型来跟踪事件类型,日期和计数。不过,考虑到你的要求,我不是100%你应该如何建模。

然后,我会触发延迟任务,以便在用户执行触发事件的事情时异步更新相应的聚合模型。

Nick Johnson的Background work with the deferred library文章提供了更多信息,并提供了一个框架,您可能会发现这种框架对于您正在谈论的那种聚合非常有用。

答案 3 :(得分:0)

solution使用游标(如下所示)会为你工作吗?我个人使用这种方法来计算类似于你的场景中的条目数,并且还没有看到任何问题(尽管我按计划运行,因为不断查询数据存储对CPU配额非常重要) )。

def count(query): 
  i = 0 
  while True: 
    result = query.fetch(1000) 
    i = i + len(result) 
    if len(result) < 1000: 
      break 
    cursor = query.cursor() 
    query.with_cursor(cursor) 
  return i 

答案 4 :(得分:0)

这篇文章很老了,但我想提供一个有用的参考。 App Engine现在提供了一个用于访问数据存储区统计信息的内置API:

对于Python,

from google.appengine.ext.db import stats

global_stat = stats.GlobalStat.all().get()
print 'Total bytes stored: %d' % global_stat.bytes
print 'Total entities stored: %d' % global_stat.count

对于Java,

import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.Query;

// ...
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
Entity globalStat = datastore.prepare(new Query("__Stat_Total__")).asSingleEntity();
Long totalBytes = (Long) globalStat.getProperty("bytes");
Long totalEntities = (Long) globalStat.getProperty("count");

也可以仅针对特定种类过滤实体编号。看一下这个参考:

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

答案 5 :(得分:-1)

这听起来与我在StackOverflow上提出的问题非常相似。

How to get the distinct value of one of my models in Google App Engine我需要知道如何为模型中的实体获取不同的值,并且该模型将有超过1000个实体。

希望有所帮助。