【问题标题】:Does App Engine NDB keys in KeyProperty count against 1MB storage limit?KeyProperty 中的 App Engine NDB 键是否计入 1MB 存储限制?
【发布时间】:2015-01-29 18:10:44
【问题描述】:

我正在 Google App Engine 中创建达到 1MB 大小限制的 NDB 模型实例。它与长度为 10-20k 的重复 StringProperty 有关。

这是一个例子:

class MyModel(ndb.Model):
    items = ndb.StringProperty(repeated=True)

instance = MyModel()
instance.items = []
For item in largeDataset:
    instance.items.append(item)

instance.put()
# Instance is >1MB Error

我的问题是解决这个问题,我可以使用 ndb keyproperties 和其他模型来代替吗?密钥是否计入 1MB 限制?

应该是这样的:

class ItemModel(ndb.Model):
    item = ndb.StringProperty()

class MyModel(ndb.Model):
    items = ndb.KeyProperty(ItemModel, repeated=True)

instance = MyModel()
instance.items = []
For item in largeDataset:
    instance.items.append(
        ItemModel(item=item).put()
    )

instance.put()
# Same problems?

我还会得到相对相同的错误吗?项目字符串的长度不是很长(约 60 个字符),但数量是可变的(20,000+),我更喜欢不会达到实例大小限制的方法。

那么密钥是否计入 1MB 限制?如果是,NDB keyProperty 的相对大小是多少?

【问题讨论】:

  • 既然您提供了代码,为什么不直接运行它,看看它是否有效?此外,您的项目是否在您put() 之后更新,您确定 Google Cloud Storage 不能更好地满足您的需求吗?如果没有 - 也许您可以检查您的数据是否超过限制,如果超过 - 执行链接列表之类的操作,您可以在其中引用下一个实体以及不适合您之前实体的其余数据,这种方式你会在一个循环中读取所有数据,并且不会限制为 1mb 的数据大小,如果需要可以存储几十 MB(不确定这有多有效)。
  • 因为项目列表是可变的,而且我现在没有一个列表可以代表模型测试它的最大值。这段代码是对我正在尝试做的事情的总体简化,在我继续使用重复的 KeyProperties 之前,我想先权衡一下 SO 的经验。
  • 如果你不需要他们查询——使用压缩的本地结构化属性。
  • 我可能会尝试压缩本地结构化属性。我预见到的唯一问题是 10 分钟的执行限制,并且 gzip 压缩对这么多项目增加的 CPU 负载可能会达到限制,但我可以解决这个问题。如果我确实使用压缩,我会更新问题。

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


【解决方案1】:

是的,属性的键值消耗实体存储空间。键使用的空间量与等效字符串成正比,例如:ParentKind:name/ChildKind:other_id。实际使用的空间取决于内部编码,但这非常接近。

如果原始值很小,您怀疑键可能占用与原始值一样多的空间是正确的。如果您陷入困境并且确定数据大小不会进一步增长,那么可能值得一试,以节省少量费用。

【讨论】:

  • 谢谢 - KeyProperty 的近似大小正是我想要的。我搜索了文档并找不到它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-10
  • 1970-01-01
  • 2012-10-15
  • 1970-01-01
  • 2010-11-02
相关资源
最近更新 更多