2

古いデータストア プロパティには、ストレージごとに 2 つのデータストア書き込み操作(DWO) があり、インデックスの作成方法によってはさらにいくつかの操作があることを覚えているようです。

古いデータストアでは、インデックスを作成する必要のないすべてのものを JSON 文字列に保存し、それを TextProperty として保存して、複数回の書き込みを節約することがよくありました。

すべてをデータストアから直接 JSON に保存して操作することに慣れてきたので、新しいアプリのために NDB に切り替えるときは、自然に NDB JsonProperty を使用しました。

いつものように、クォータ制限を初めてチェックしたとき (典型的な無料クォータ制限のユーザー エクスペリエンスですか?) 最適化について偏執的になり、すべてのデータストア書き込み (完全に JsonProperties のみのモデルで構成されている) がクロックアップしていることに気付きました。多くの DWO 割り当て。

すぐに疑問に思いました: JsonProperty の構造に応じて、GAE DataStore は複数の書き込みを行いますか? それとも、「ブロブ」ストアに必要な数の DWO で、プロパティ ブロブ全体をデータストアに格納するだけですか?

私は後者だと思い、ドキュメントでそのように読んだことを思い出しましたが、クォータの大量消費 (典型的な無料クォータ制限ユーザーのパラノイア?) を考えると、JsonProperty を使用することは、古いデータストアを使用して JSON を保存するほど効率的ではないのではないかと思いました。 TextProperty としての文字列 -- これは確かに構造化されていない blob です。

これが決定的に解決できればいいのですが、アプリだけに焦点を当てるという「appengine の約束」に戻ることができます。:)

4

1 に答える 1

4

データストアはランタイムに依存せずpythonndbや JSON などの存在を認識しないため、データに基づいて異なる方法でインデックス作成/書き込みを行うことはできません。実装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):

compressedの状況をTrueデフォルトのと比較しているようですFalse。に設定してTrue、比較するためにいくつかの生の数値を投稿してみてください (db意味を理解するために、ケースからのいくつかの数値でも)。

アップデート:

私はこれについて十分に明確であるかどうか確信が持てませんでした.Guidoのコメントの後、私がそうでなかったことは明らかです. ブロブ プロパティのデータストア書き込みは、ndbブロブ プロパティのデータストア書き込みとまったく同じになりますdbこれらの数値は、エンティティが存在するかどうか、およびプロパティがインデックス化されているかどうかによって異なります。私のコメントcompressedは、あなたが混乱しているかもしれない他のパフォーマンス/帯域幅/サイズの問題に対処することでした.

請求ページを確認すると、高レベルの操作から低レベルの操作へのマッピングがあります。あなたが私たちについて尋ねていることに関連しています:

  • New Entity Put (エンティティ サイズに関係なく、エンティティごと) : 2 回の書き込み + インデックス付きプロパティ値ごとに 2 回の書き込み + 複合インデックス値ごとに 1 回の書き込み
  • 既存のエンティティのプット (エンティティごと) : 1 回の書き込み + 変更されたインデックス付きプロパティ値ごとに 4 回の書き込み + 変更された複合インデックス値ごとに 2 回の書き込み
于 2013-02-27T03:47:57.920 に答える