2013-05-13 28 views
1

所以这个代码:跑出去“资料储存库小型操作”配额的意外

all_nodes = Nodes.query() 
country_nodes = [] 
for n in all_nodes: 
    country_nodes.append([n.country, all_nodes.filter(Nodes.country == n.country).count()]) 

只是核爆我Datastore Small Operations配额甚至没有完成作业?

什么是正确的方式来获得上述名单?

+0

明白了。问题在于这些国家并不是独一无二的。有些人有1000个参赛作品,所以有一百万个参赛作品,而不是两三千人。首先让这些国家把它们放在一个设置为'countries = set([i.country for i in all_nodes])'中,然后使用它进行过滤。 – timkofu 2013-05-13 14:06:59

回答

1

在GAE中,当您编写新记录时,可能会更好地跟踪每个国家/地区的总计。然后你可以通过一次阅读找出一个国家的总数。例如,您可以添加一个新的模式类型:

class Country(db.Model): 
    name = db.StringProperty() 
    count = db.IntegerProperty() 

然后,当你添加一个新的节点,就可以得到相应的Country记录,并增加其count财产。

在您的示例中,当您执行all_nodes.filter(...)时,您正在为all_nodes中的每个n运行一个新查询。以下,应该是计算总数的更便宜的方法。但是当你写新的记录时,它可能比跟踪国家总数要贵。

from collections import defaultdict 

country_nodes = defaultdict(int) 
for n in Nodes.query(): 
    country_nodes[n.country] += 1 
0

使用limit=nn =最小你能负担得起)在count()fetch() 为,例如,看是否存在任何记录使用count(limit=1)filter()对指数做count()最小。 在大型记录数据库中获取“超出数据存储小操作配额”非常容易。总是想想有多少记录可能会在结果中,或将在内部处理nonindexed :)