如何优化NDB数据存储区的读取操作?

时间:2013-11-11 07:07:22

标签: google-app-engine app-engine-ndb

我有以下类来存储数据:

class AppList(ndb.Model):
    '''
    Index
      Key:              sender
    '''
    sender = ndb.StringProperty()
    texts = ndb.StringProperty(repeated=True)
    recipients = ndb.StringProperty(repeated=True)
    service_centers = ndb.StringProperty(repeated=True)
    counter = ndb.IntegerProperty(default=0)
    ignore = ndb.BooleanProperty(default=False)

    added = ndb.DateTimeProperty(auto_now_add=True, indexed=False)
    updated = ndb.DateTimeProperty(auto_now=True, indexed=False)

目前它包含大约4,000条记录。

当我尝试在循环中使用以下代码阅读它时:

entries = AppList.query()
res, cur, more = entries.fetch_page(100, start_cursor=cur)

它以OverQuotaError(The API call datastore_v3.RunQuery() required more quota than is available.)失败。免费配额为0.05百万行动。看起来它是因为多个repeated属性而发生的。但是我读取所有值的唯一任务是将False值分配给每条记录的ignore属性(entry.ignore = False)。

在我的情况下,有没有办法优化阅读?

3 个答案:

答案 0 :(得分:1)

当您获取所有实体并更新它们时,appstats不会给您带来很多帮助。

当您尝试更新实体时,投影查询无法正常工作。在几天内完成各个部分的udpates,这样您就不会超过配额或启用结算。

编写具有大量属性的实体会产生更高的IOPS,因为您还要更新索引。如果任何属性不需要索引,请设置noindex = True并重新部署这将减少IOPS,不确定这将产生多大的影响。默认情况下,BlobProperty以外的每个属性都会被编入索引。

答案 1 :(得分:1)

50k是数据存储可计费操作daily free quota。请注意,数据存储可计费操作与数据存储区API调用不同。请参阅this table进行比较。

因此,查询4k实体将导致8k可计费数据存储操作。如果您接近每日50k的限制,则此API调用将失败并出现指示错误。

答案 2 :(得分:0)

如果您不需要获取所有属性的值,则可以使用projection query,例如:

entries = AppList.query()
res, cur, more = entries.fetch_page(100, start_cursor=cur, projection=[AppList.ignore])

但是,上述方法可能无法解决您的问题,因为实体的每次提取都应该只有一次读取,因此可能还会有其他内容。