我有以下类来存储数据:
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
)。
在我的情况下,有没有办法优化阅读?
答案 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])
但是,上述方法可能无法解决您的问题,因为实体的每次提取都应该只有一次读取,因此可能还会有其他内容。