Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 需要一种计算GAE数据存储中满足特定条件的实体的方法吗?(超过1000个实体)_Python_Google App Engine_Google Cloud Datastore - Fatal编程技术网

Python 需要一种计算GAE数据存储中满足特定条件的实体的方法吗?(超过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…我的方法是使用一个或多个聚合

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

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

1000英镑的上限对我通常的做法造成了影响。我不需要检索所有实体并将它们呈现给用户,但我需要显示特定日期范围的总计数。有什么建议吗


我有点python/GAE noob…

我的方法是使用一个或多个聚合模型来跟踪事件类型、日期和计数。不过,考虑到您的需求,我不是100%确定您应该如何建模

然后,每当用户执行触发事件的操作时,我会启动延迟任务以异步更新相应的聚合模型


Nick Johnson的文章提供了更多的信息,并提供了一个框架,您可能会发现它对进行您所说的聚合非常有用。

应用程序引擎不是关系数据库,您将无法像这样快速地进行计数。最好的方法是在写入时更新计数,而不是在读取时生成计数

在生成计数时,有两种通用方法可以很好地与App Engine配合使用以最小化写入争用:

  • 将计数存储在Memcache或本地内存中,并定期刷新。这是最简单的解决方案,但它可能是不稳定的,并且可能会丢失数据
  • 使用一个。这种方法更可靠,但更复杂。您将无法轻松地按计数进行排序,但也可以定期刷新到另一个索引计数字段,并按该字段进行排序

  • 这听起来很像我在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");