Python 如何使用1000+;谷歌应用程序引擎中的行但很少读取?

Python 如何使用1000+;谷歌应用程序引擎中的行但很少读取?,python,google-app-engine,count,google-cloud-datastore,counter,Python,Google App Engine,Count,Google Cloud Datastore,Counter,我有一个只有管理员才能看到的用户列表。此列表还显示数据存储中的用户数计数。因为列表可能会超过1000,所以我的第一个想法是避免使用正常的count(),而是使用切分计数器 然而,问题是管理员还可以访问各种搜索过滤器(在GUI中),例如仅查看男性/女性用户等等。重要的是,计数反映了这些过滤器,这样他们就可以得到女性用户、男性用户和无数其他组合的数量 因此,分片计数器和不分片的高并发计数器似乎不是一个好主意,因为我需要为搜索过滤器的每个组合创建一个计数器 我应该简单地创建count()方法的循环(如

我有一个只有管理员才能看到的用户列表。此列表还显示数据存储中的用户数计数。因为列表可能会超过1000,所以我的第一个想法是避免使用正常的count(),而是使用切分计数器

然而,问题是管理员还可以访问各种搜索过滤器(在GUI中),例如仅查看男性/女性用户等等。重要的是,计数反映了这些过滤器,这样他们就可以得到女性用户、男性用户和无数其他组合的数量

因此,分片计数器和不分片的高并发计数器似乎不是一个好主意,因为我需要为搜索过滤器的每个组合创建一个计数器

我应该简单地创建count()方法的循环(如所述),还是这种做法非常糟糕?否则我怎么做


请注意,此计数器用于管理接口,读取次数非常有限。这确实是一个为了灵活性和准确性而牺牲一些读取性能的例子。虽然它应该能够增长到1000以上,但预计不会超过10000。

计数循环”很慢,但现在你可以用它来做得更好一些。通常情况下,我会建议对您需要的所有“过滤”计数器进行非规范化,但这会减慢用户添加和删除(以及可能的人口统计变化),因此,考虑到具有非常低读取量的特定用例,您可能可以使用“计数循环”方法(加上游标;-).

我尝试了两种方法:

1) 编写我自己的任务,以固定的实体限制(例如50)查询数据存储(该查询是一个键降序查询)。然后,它将下一个任务排入队列,开始查询它停止的位置。每个任务将下一个任务排入队列,并向其传递两个参数(最后一个停止的位置就像一个光标和它所看到的实体总数)


2) 这种方法简单得多,即使用google为appengine提供的mapreduce库。它完全在用户空间中运行,因此您只需下载并构建库并将其包含在项目中。基本上,它将处理您指定的所有实体的迭代,并允许您编写一个处理程序来处理每个实体(如递增计数器)。查看这里的详细信息:mapreduce.appspot.com-他们甚至有一个示例应用程序,可以满足您的要求。唯一的问题是,除非您自己这样做,否则结果将显示在您的浏览器中,而不一定存储在数据存储中。

这里介绍的第二种方法,使用mapreduce定期重新计算所有重要的统计数据,似乎是最好的方法。哦,我以前从未听说过mapreduce,我得调查一下。这种方法是完全准确的,还是需要定期更新(比如使用任务队列的不分片的高并发计数器)?它是否需要我设置所有可能的过滤器组合,以便能够手动计数?如果您拥有的实体数量在地图缩小过程中发生变化,那么这些实体将不会被计数。map reduce基本上在某个时间点拍摄快照。在中,您不会实时计算在任何给定时刻拥有的实体数。我使用它在每天结束时生成统计数据。关于你的过滤器,你必须对每一个可能的组合进行计数,但是你可以对一个地图使用多个计数器。单个map reduce只能迭代一种实体类型。假设你有一个人实体。对于映射到的每个实体,将增加一个名为“total”的计数器。如果此人是男性,您还将增加一个名为“男性”的计数器。您还可以增加一个名为“6月男性生日”的计数器,以便能够按性别和生日月份筛选实体。您可以有许多这样的计数器,它们的结果将显示在地图的末尾。我还没有弄清楚的一件事是如何将这些映射结果存储到数据存储中。这就是我要问的问题和另一个问题——这两个问题都还不可能。。。。谢谢你的回答!是的,考虑到我的阅读量很少,而且我甚至不确定列表是否会超过1000,我很受这种方法的诱惑。当您谈到游标时,您的意思是我应该使用游标来决定count()的下一个位置吗?