Appengine NDB:放置880行,超过数据存储区写操作配额。为什么?

时间:2013-06-13 03:25:10

标签: google-app-engine python-2.7 google-cloud-datastore app-engine-ndb

我有一个应用程序,使用put_async()将880行导入NDB数据存储区。每当我运行此导入时,它都会超过每天为数据存储区写入50,000个操作的配额。

我试图理解为什么这项操作如此昂贵,以及如何保持在配额范围内。

有13列如此:

stringbool = ['true', 'false']
class BeerMenu(ndb.Model):
  name = ndb.StringProperty()
  brewery = ndb.StringProperty()
  origin = ndb.StringProperty()
  abv = ndb.FloatProperty()
  size = ndb.FloatProperty()
  meas = ndb.StringProperty()
  price = ndb.FloatProperty()
  active = ndb.StringProperty(default="false", choices=stringbool)
  url = ndb.StringProperty()
  bartender = ndb.StringProperty()
  lineno = ndb.IntegerProperty()
  purdate = ndb.DateProperty()
  costper = ndb.FloatProperty()

我已将索引修改为一个:

- kind: BeerMenu
  properties:
    - name: brewery
    - name: name

根据SDK数据存储区查看器,每行有29个写操作,因此会生成25520个写操作!我假设索引消耗了其余的写操作,但我不确切知道有多少,因为AppEngine只是说我超出了配额。

减少写操作次数的最佳策略是什么?

2 个答案:

答案 0 :(得分:8)

默认情况下,除text和blob属性之外的所有属性都会编入索引。因此,如果对字符串属性进行deindex,则所有float属性,int属性和日期属性仍会被编入索引。您应该将indexed=False添加到其他属性以减少写入。

index.yaml中列出的索引是属性索引的附加索引。 index.yaml索引用于有序和关系查询之类的东西(即,日期> date_property的查询将在index.yaml中生成一个条目)。

答案 1 :(得分:1)

在此处,查看数据存储区通话费用部分,以便您了解更多信息:

Paid Apps: Budgeting, Billing, and Buying Resources

希望这也有帮助。