1

私の App Engine アプリ (Python 2.7 では、スレッドセーフ) で、私の ChildModel 種類のすべてのエンティティに関する情報を表示できるようにしたいと考えています。memcache は機能していると思いますが、ChildModel には ParentModel に接続するプロパティがあるため、理解できないことがいくつかあります。

私は現在、次のモデルを持っています。

class ParentModel(db.Model):
  name = db.StringProperty()
  # currently 109 of these

class ChildModel(db.Model):
  name = db.StringProperty()
  parent_program = db.ReferenceProperty(ParentModel)
  # currently 758 of these

Nick Johnson のブログの例を使用して memcache を実装しました。

class AllEntities(webapp2.RequestHandler):
  def get(self):
    entitylist = deserialize_entities(memcache.get("entitylist"))
    if not entitylist:
      entitylist = ChildModel.all().fetch(None)
      memcache.set("entitylist", serialize_entities(entitylist))
    totalnum = ChildModel.all().count()

これを初めて実行すると、appstats に次のように表示されます。

datastore_v3.Get        758
datastore_v3.RunQuery   3
datastore_v3.Next       2
memcache.Get        1
memcache.Set        1

その後、appstats に次のように表示されます。

datastore_v3.Get        758
datastore_v3.RunQuery   2
memcache.Get            1

memcache のサイズ (1304599 バイト) に基づいて、memcache が正しく設定されているようです。しかし、758 の datastore_v3.Get を停止する方法がわかりません。これは非常に遅く、Datastore Small Operations と Datastore Read Operations のクォータで私を殺しています。

誰かが私が間違っていることを理解するのを手伝ってもらえますか?

4

2 に答える 2

2

deserialize_entity関数を確認します。すべての子エンティティ(参照プロパティ)をプルする場合は、一度に1つずつ実行します(したがって、多くのgetが実行されます)。

参照されるエンティティをバッチ取得でプリフェッチする場合は、NickJohnsonsのprefetch_refpropブログ記事を参照してください。

または、deserialize_entitiesを変更して、参照プロパティが不要な場合はフェッチしないようにします

于 2012-07-04T02:23:52.577 に答える
2

count() は 758 の取得を行っているものであり、小さな操作クォータがかかります。

すべてのモデルを memcache からリストにロードしたので、呼び出しlen(entitylist)てエンティティの量を取得するだけです。


Nick のブログ で説明されているようにprefetch_refprops(entitylist, ChildModel.parent_program)、memcache に値を設定する前に呼び出してみてください。

于 2012-07-03T21:31:13.367 に答える