【发布时间】: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