首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何优化NDB数据存储区的读取操作?

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

Stack Overflow用户
提问于 2013-11-11 15:07:22
回答 3查看 531关注 0票数 1

我有以下类来存储数据:

代码语言:javascript
运行
复制
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条记录。

当我尝试用循环中的以下代码来读取它时:

代码语言:javascript
运行
复制
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属性。

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

EN

回答 3

Stack Overflow用户

发布于 2013-11-11 18:51:37

appstats不会有太大帮助,因为您正在获取所有实体并更新它们。

当您尝试更新实体时,投影查询将不起作用。在几天内零星地完成udpates,这样您就不会超过您的配额或启用计费。

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

票数 1
EN

Stack Overflow用户

发布于 2013-11-11 19:08:16

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

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

票数 1
EN

Stack Overflow用户

发布于 2013-11-11 16:56:39

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

代码语言:javascript
运行
复制
entries = AppList.query()
res, cur, more = entries.fetch_page(100, start_cursor=cur, projection=[AppList.ignore])

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19900692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档