与旧数据存储区属性相比,NDB JsonProperty配额影响?

时间:2013-02-27 02:18:37

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

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

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

我已经习惯了直接从数据存储中保存并使用JSON中的所有内容,当切换到新的应用程序的NDB时,我自然地使用了NDB JsonProperty。

像往常一样,我第一次检查配额限制(典型的免费配额限制用户体验?)时,我对优化变得偏执,并注意到所有数据存储区写入(完全由仅包含JsonProperties的模型组成)获得了大量的DWO配额。

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

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

如果能够明确地解决这个问题会很好,所以我可以回到仅仅在应用程序上关注的“appengine承诺”。:)

1 个答案:

答案 0 :(得分:4)

数据存储区与运行时无关,并且不知道存在pythonndb或JSON这样的内容,因此它无法根据您的数据进行不同的索引/写入。在implementation中,JsonPropertyBlobProperty,只使用json来序列化和反序列化数据:

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

BlobProperty can be indexed与否,还是compressed与否:

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

您似乎可能正在将compressedTrue的情况与默认的False进行比较。尝试将其设置为True,并可能发布一些原始数字进行比较(甚至是db案例中的某些数字以获得理解)。

更新:

我不确定我对此是否清楚,并且在Guido发表评论之后很清楚我不是。 您的ndb blob属性的数据存储区写入与您的db blob属性的数据存储区写入完全相同。这些数字会根据实体是否存在而更改,以及属性是否已编入索引。我对compressed的评论是为了解决您可能感到困惑的任何其他性能/带宽/尺寸问题。

如果您查看billing page,则会有从高级操作到低级操作的映射。与您所询问的内容相关:

  • 新实体投放(每个实体,无论实体规模如何):每个索引属性值写入+ 2次写入+每个复合索引值写入1次
  • 现有实体投放(每个实体):每个修改后的索引属性值写入1次+写入+每个修改后的复合索引值写入2次