Python 需要一种计算GAE数据存储中满足特定条件的实体的方法吗?(超过1000个实体)
我正在GAE上构建一个应用程序,需要报告发生的事件。事件有一个类型,我还需要按事件类型报告 例如,假设有一个事件A、B和C。它们随机周期性地发生。用户登录并创建一组实体,这些事件可归因于这些实体。当用户回来检查状态时,我需要能够告诉在特定的时间范围内(比如一天或一个月),A、B和/或C发生了多少事件 1000英镑的上限对我通常的做法造成了影响。我不需要检索所有实体并将它们呈现给用户,但我需要显示特定日期范围的总计数。有什么建议吗Python 需要一种计算GAE数据存储中满足特定条件的实体的方法吗?(超过1000个实体),python,google-app-engine,google-cloud-datastore,Python,Google App Engine,Google Cloud Datastore,我正在GAE上构建一个应用程序,需要报告发生的事件。事件有一个类型,我还需要按事件类型报告 例如,假设有一个事件A、B和C。它们随机周期性地发生。用户登录并创建一组实体,这些事件可归因于这些实体。当用户回来检查状态时,我需要能够告诉在特定的时间范围内(比如一天或一个月),A、B和/或C发生了多少事件 1000英镑的上限对我通常的做法造成了影响。我不需要检索所有实体并将它们呈现给用户,但我需要显示特定日期范围的总计数。有什么建议吗 我有点python/GAE noob…我的方法是使用一个或多个聚合
我有点python/GAE noob…我的方法是使用一个或多个聚合模型来跟踪事件类型、日期和计数。不过,考虑到您的需求,我不是100%确定您应该如何建模 然后,每当用户执行触发事件的操作时,我会启动延迟任务以异步更新相应的聚合模型
Nick Johnson的文章提供了更多的信息,并提供了一个框架,您可能会发现它对进行您所说的聚合非常有用。应用程序引擎不是关系数据库,您将无法像这样快速地进行计数。最好的方法是在写入时更新计数,而不是在读取时生成计数 在生成计数时,有两种通用方法可以很好地与App Engine配合使用以最小化写入争用:
这听起来很像我在StackOverflow上提出的问题 我需要知道如何在我的模型中为一个实体获取一个不同的值,这个模型将有1000多个实体 希望对您有所帮助。使用游标(如下面的一个)对您有用吗?我个人使用这种方法计算与您类似的场景中的条目数,但还没有发现任何问题(尽管我是按计划运行的,因为不断查询数据存储会对CPU配额造成很大的负担)
def计数(查询):
i=0
尽管如此:
结果=query.fetch(1000)
i=i+len(结果)
如果len(结果)<1000:
打破
cursor=query.cursor()
带光标的查询(光标)
返回i
datastore count()查询的结果
和所有数据存储查询的偏移量
不再限制在1000
由于版本1.3.6这篇文章已经很老了,但我想提供一个有用的参考。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");
也可以仅针对特定种类过滤实体编号。看看这个参考资料:
在这种情况下,这真的不起作用-数据过于细粒度,无法有效地进行切分。我还需要保存一段时间的历史记录。但是谢谢你的时间!阅读Ikai的链接-切分计数器不依赖于数据切分,而是依赖于计数器本身的切分。谢谢!我一定去看看。主要问题是聚合计数不能很好地满足报告需求,尤其是在筛选数据时。正如前面的回答所提到的,关系数据库是理想的,但我认为必须有一种方法来完成类似的事情。我还忘了添加一些关于平均值的内容。我认为可以实现这一点的一种方法是使用循环和“分页”数据。每次返回时,对所有值和递增计数器进行求和。然后,一旦它返回最后一个值,取总和并除以计数器。但是,我不知道这是否适用于.filter属性或GQL。有什么想法吗?这是一个类似的问题,除了最终结果不是作为不同的实体输出,而是作为总和或平均值输出。谢谢!我仍在达到1000个上限。干杯,但我有超过100000个实体需要计数。@Gavin然后使用计数(1000000):)(处理如此大量实体的正确方法是在创建新实体时增加一个计数器)谢谢-我会尝试一下。可能比我的循环更有效率!另一种可能的复制方法是在数据存储中保留一个计数器(每次添加/删除都会更新),或者在必要时切分此计数器。是否有其他方法仅使用数据存储库获取整体实体状态?不使用
app.engine
library!
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");