1

我有以下类来存储数据:

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.)。免费配额为 05 万次操作。看起来它是由于多个repeated属性而发生的。但是我读取所有值的唯一任务是将 False 值分配给ignore每个记录的属性(entry.ignore = False)。

就我而言,有什么方法可以优化阅读吗?

4

3 回答 3

1

当您获取所有实体并更新它们时,appstats 不会有太大帮助。

当您尝试更新实体时,投影查询将不起作用。在几天内进行零碎更新,这样您就不会超出配额或启用计费。

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

于 2013-11-11T10:51:36.640 回答
1

50k 是数据存储计费操作每日免费配额。请注意,数据存储可计费操作与数据存储 API 调用不同。请参阅此表进行比较。

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

于 2013-11-11T11:08:15.607 回答
0

如果不需要获取所有属性的值,可以使用投影查询,例如:

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

但是,上述内容可能无法解决您的问题,因为实体的每次获取都应该只是一次读取,因此可能会发生其他事情。

于 2013-11-11T08:56:39.367 回答