2

我似乎记得旧的数据存储属性每个存储有 2 个数据存储写入操作(DWO),可能还有更多,具体取决于它们的索引方式。

在旧数据存储中,我经常将不需要索引的所有内容存储在 JSON 字符串中,并将其存储为 TextProperty 以保存多次写入。

习惯于直接从数据存储中以 JSON 格式保存和处理所有内容后,在切换到 NDB 以获取新应用程序时,我自然而然地使用了 NDB JsonProperty。

像往常一样,当我第一次检查我的配额限制(典型的免费配额限制用户体验?)时,我对优化变得偏执,并注意到所有数据存储写入(完全由只有 JsonProperties 的模型组成)正在加速很多 DWO 配额。

我立即想知道:GAE DataStore 是否根据 JsonProperty 的结构进行多次写入?或者它只是将整个属性 blob 存储到数据存储中,就像“blob”存储所需的一样少的 DWO?

我认为是后者,并记得在文档中这样读过,但是大量的配额消耗(典型的免费配额限制用户偏执狂?),让我想知道使用 JsonProperty 是否不如使用旧数据存储和保存 JSON 高效作为 TextProperty 的字符串——它们肯定是非结构化的 blob。

如果可以彻底清除这将是一件好事,这样我就可以回到只关注应用程序的“appengine 承诺”。:)

4

1 回答 1

4

数据存储区与运行时无关,并且不知道有诸如 JSON 或 JSON 之类的东西pythonndb因此它无法根据您的数据进行不同的索引/写入。在实现中,JsonProperty是一个BlobProperty并且仅用于json序列化和反序列化数据:

class JsonProperty(BlobProperty):
  def __init__(self, name=None, compressed=False, json_type=None, **kwds):

ABlobProperty 可以是 indexed或不是,也可以是或compressed不是:

class BlobProperty(Property):
  _indexed = False
  _compressed = False
  def __init__(self, name=None, compressed=False, **kwds):

看来您可能正在将compressedwasTrue与默认的False. 尝试将其设置为True并发布一些原始数字以进行比较(甚至是案例中的一些数字db以了解情况)。

更新:

我不确定我对此是否足够清楚,在 Guido 的评论之后,很明显我不是。为您的 blob 属性写入的数据存储将与为您的ndbblob 属性写入的数据存储完全相同db这些数字根据实体是否存在以及属性是否被索引而变化。我的评论compressed是为了解决您可能感到困惑的任何其他性能/带宽/大小问题。

如果您查看计费页面,则会发现从高级操作到低级操作的映射。与您所询问的内容相关,我们有:

  • 新实体放置(每个实体,无论实体大小):2 次写入 + 每个索引属性值 2 次写入 + 每个复合索引值 1 次写入
  • 现有实体放置(每个实体):1 次写入 + 每个修改的索引属性值 4 次写入 + 每个修改的复合索引值 2 次写入
于 2013-02-27T03:47:57.920 回答