繁体   English   中英

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

[英]How to optimize read operation from NDB datastore?

我有以下课程来存储数据:

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 )。

在我的情况下,有什么方法可以优化阅读?

当您获取所有实体并对其进行更新时,appstats不会有太大帮助。

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

编写具有很多属性的实体会导致更高的IOPS,因为您还要更新索引。 如果任何属性不需要索引,请设置noindex = True并重新部署,这将减少您的IOPS,不确定是否会产生多少影响。 默认情况下,除BlobProperty之外的所有其他属性均已编制索引。

50k是您的数据存储计费操作的 每日免费配额 请注意, 数据存储区计费操作与数据存储区API调用不同。 见下表进行比较。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM