【问题标题】:app engine ndb fetch is very slowapp engine ndb fetch 很慢
【发布时间】:2015-06-12 18:18:17
【问题描述】:

我需要存储大量 ModelA 实体,并且由于应用引擎定价基于写入/读取的实体数量,因此我将 100 个实体捆绑在一起并将它们存储为一个 ModelB

class ModelA(ndb.Expando):
  a1 ... a20 = ndb.IntegerProperty()

class ModelB(ndb.Model):
  data = ndb.StructuredProperty(ModelA, repeated=True)

我的数据存储中只有 80 个这样的 ModelB 实体,应该使用大约 1-2MB 的内存,但 ModelB.query().fetch() 需要 5 秒。有什么办法可以让这更快吗?使用LocalStructuredProperty 代替StructuredProperty 会更好吗?

【问题讨论】:

  • 考虑到如果您需要修改ModelA 的值,以这种方式捆绑可能不是最佳的。此外,ModelB.query().fetch() 将尝试加载 ModelB 的所有实例,您可能希望先将其过滤掉。也许你可以给我们更多关于你想要做什么的细节。
  • 我不想修改ModelA的值(它们是每分钟采样一次的设备的状态),我只需要稍后阅读它们。在我的实际应用程序中,modelB 还包含一个 DateTime 变量,我正在对其进行过滤,但过滤结果将来可能会达到 80 的长度。等待 5 秒以获取仅代表的 1-2mb 数据似乎很奇怪80 个实体。
  • LocalStructuredProperty 应该更好,因为它没有被索引,并且可以被压缩。无论如何,如果ModelA 是一个复杂对象,请考虑到序列化/反序列化可能会带来性能问题

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


【解决方案1】:

如果您不需要索引值(用于查询),您可能希望将它们存储为不透明对象:

class ModelB(ndb.Model):
    data = ndb.JsonProperty(indexed=False)

    def add_data(self, model_a)
        if not self.data:
            self.data = []
        self.data.append(model_a)

这将避免处理结构化属性和验证的开销。

【讨论】:

  • 谢谢,我用 JsonProperty 重试了,效果好多了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多