7

目的は、非常に頻繁に実行され、毎回数百のキーを db.get() する必要があるコードの CPU コストと応答時間を削減することです。

これでも機能しますか?

エンティティのサイズを縮小すると、数百のキーを持つ db.get() の API 時間がほぼ直線的に短縮されると期待できますか? 現在、エンティティには次のデータが添付されています: 9 つの文字列、9 つのブール値、8 つの整数、1 つの GeoPt、2 つの DateTime、1 つのテキスト (平均サイズ ~100 バイト FWIW)、1 つの参照、1 つの StringList (平均サイズ 500 バイト)。目標は、このデータの大部分を関連するクラスに移動して、メイン モデルのコア フェッチを高速化することです。

機能する場合、どのように実装されていますか?

リファクタリング後も、既存のエンティティをフェッチするのと同じ高コストが発生しますか? ドキュメントには、モデルのすべてのプロパティが同時にフェッチされると記載されています。ユーザーが待機している間に、古い不要なプロパティが引き続き RPC 経由で転送されますか? つまり、エンティティの読み込み時間を短縮したい場合、古いエンティティを新しい定義のエンティティに移行する必要がありますか? もしそうなら、エンティティを re-put() するだけで十分ですか、それともまったく新しいキーで保存する必要がありますか?

検討:

class Thing(db.Model):
    text    = db.TextProperty()
    strings = db.StringListProperty()
    num     = db.IntegerProperty()

thing = Thing(key_name='thing1', text='x' * 10240,
      strings = ['y'*500 for i in range(10)], num=23)
thing.put()

Thing を再定義して合理化し、新しいバージョンをプッシュするとします。

class Thing(db.Model):
    num = db.IntegerProperty()

そして、私はそれをもう一度取得します:

thing_again = Thing.get_by_key_name('thing1')

このエンティティのフェッチ時間を短縮しましたか?

4

3 に答える 3

12

質問に順番に答えるには:

  • はい、モデルを分割するとフェッチ時間が短縮されますが、おそらく直線的ではありません。あなたのような比較的小さなモデルの場合、違いはそれほど大きくないかもしれません。大きなリスト プロパティは、フェッチ時間が長くなる主な原因です。
  • モデルの変更後にエンティティをフェッチすると、古いプロパティが引き続き転送されます。これは、データストアがモデルを認識していないためです。
  • ただし、.put() を呼び出しても、削除されたプロパティは引き続き保存されます。現在、古いプロパティを削除する方法は 2 つあります。既存のすべてのエンティティを新しいものに置き換えるか、低レベルの api.datastore インターフェイスを使用します。これは辞書のようで、キーを簡単に削除できます。
于 2009-10-10T18:13:35.127 に答える
1

エンティティからプロパティを削除するには、モデルを Expando に変更してから、delattrを使用します。これは、次の App Engine ドキュメントに記載されています。

http://code.google.com/intl/fr/appengine/articles/update_schema.html

「削除されたプロパティをデータストアから削除する」という見出しの下

于 2010-01-06T21:29:52.473 に答える
0

エンティティのサイズを縮小したい場合、古いエンティティを新しい定義のエンティティに移行する必要がありますか?

はい。GAE データ ストアは単なる大きなキー値ストアであり、モデル定義については何も知りません。したがって、新しい値を入力するまで、古い値は古い値になります!

于 2009-10-10T13:48:35.100 に答える