29

我正在阅读 Google App Engine 组的许多用户(Fig1Fig2Fig3),他们无法弄清楚在其计费报告中读取的大量 Datastore 来自何处。
您可能知道,Datastore 读取的上限为 50K 操作/天,高于您必须支付的预算。

50K 操作听起来像是很多资源,但不幸的是,似乎每个操作(Query、Entity fetch、Count..)都隐藏了几个 Datastore 读取。

是否可以通过 API 或其他方法知道有多少 Datastore 读取隐藏在 common调用 RPC.get后面?RPC.runquery

在这种情况下, Appstats似乎没用,因为它只提供 RPC 详细信息,而不是隐藏的读取成本。

有一个像这样的简单模型:

class Example(db.Model):
    foo = db.StringProperty()    
    bars= db.ListProperty(str)

和数据存储区中的1000 个实体,我对这些操作的成本感兴趣:

items_count =  Example.all(keys_only = True).filter('bars=','spam').count()

items_count = Example.all().count(10000) 

items = Example.all().fetch(10000)

items = Example.all().filter('bars=','spam').filter('bars=','fu').fetch(10000)

items = Example.all().fetch(10000, offset=500)

items = Example.all().filter('foo>=', filtr).filter('foo<', filtr+ u'\ufffd')
4

2 回答 2

10

请参阅http://code.google.com/appengine/docs/billing.html#Billable_Resource_Unit_Cost。查询花费您 1 次阅读加上每个返回实体的 1 次阅读费用。“返回”包括被偏移量或计数跳过的实体。因此,对于这些中的每一个,这是 1001 次读取:

Example.all(keys_only = True).filter('bars=','spam').count() 
Example.all().count(1000)
Example.all().fetch(1000)
Example.all().fetch(1000, offset=500)

对于这些,收费的读取数是 1 加上匹配过滤器的实体数:

Example.all().filter('bars=','spam').filter('bars=','fu').fetch()
Example.all().filter('foo>=', filtr).filter('foo<', filtr+ u'\ufffd').fetch()

您应该考虑将计数存储在数据存储中,而不是使用计数,如果您需要每秒更新一次以上计数,则分片。http://code.google.com/appengine/articles/sharding_counters.html

只要有可能,您应该使用游标而不是偏移量。

于 2011-11-13T21:59:04.790 回答
3

只想确认一下:

我几乎可以肯定:

Example.all().count(10000)

这个使用小型数据存储操作(无需获取实体,仅获取键),因此这将计为 1 次读取 + 10,000(最大)次小型操作。

于 2012-01-13T16:35:12.057 回答