【问题标题】:How to optimize read operation from NDB datastore?如何优化 NDB 数据存储区的读取操作?
【发布时间】:2013-11-11 07:07:21
【问题描述】:

我有以下类来存储数据:

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

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

【问题讨论】:

标签: google-app-engine app-engine-ndb


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 谢谢。但在我的情况下,entries.fetch_page(100, start_cursor=cur) 看起来不仅仅是 200 (=100*2) 个可计费操作。由于有 4000 个实体进行更新,我应该在限制范围内。此外,即使我转到数据存储查看器并列出页面,一段时间后我也会收到OverQuotaError
    • 记住它不仅仅是阅读成本。更新成本会更高,因为每个 put() 都会更新属性的所有索引
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-03
      • 2012-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-17
      相关资源
      最近更新 更多