我有以下类来存储数据:
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)
目前,它包含了大约4000条记录。
当我尝试用循环中的以下代码来读取它时:
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值赋给每个记录(entry.ignore = False
)的ignore
属性。
在我的情况下,有什么方法可以优化阅读吗?
发布于 2013-11-11 18:51:37
appstats不会有太大帮助,因为您正在获取所有实体并更新它们。
当您尝试更新实体时,投影查询将不起作用。在几天内零星地完成udpates,这样您就不会超过您的配额或启用计费。
写入具有大量属性的实体将导致更高的IOPS,因为您还需要更新索引。如果有任何属性不需要索引,请设置noindex=True并重新部署,这将降低您的IOPS,不确定这将产生多大影响。默认情况下,除BlobProperty之外的每个属性都会被索引。
发布于 2013-11-11 19:08:16
50k是您用于数据存储区计费操作的daily free quota。请注意,数据存储计费操作与数据存储API调用不同。请参阅this table以进行比较。
因此,查询4k个实体将导致8k个可计费的数据存储操作。如果您接近每日50k的限制,则此API调用将失败,并显示错误。
发布于 2013-11-11 16:56:39
如果您不需要获取所有属性的值,则可以使用projection query,例如:
entries = AppList.query()
res, cur, more = entries.fetch_page(100, start_cursor=cur, projection=[AppList.ignore])
然而,上述方法可能不能解决您的问题,因为实体的每次获取都应该只是一次读取,因此可能会有其他事情发生。
https://stackoverflow.com/questions/19900692
复制相似问题