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

你没有做错任何事,count() 是什么在做 758 获取并花费你少量的操作配额。

由于您已将所有模型从 memcache 加载到列表中,您只需调用len(entitylist)即可获取实体数量。


按照尼克的博客中的描述,在prefetch_refprops(entitylist, ChildModel.parent_program)设置内存缓存中的值之前尝试调用。

于 2012-07-03T21:31:13.367 回答
2

我会检查你的 deserialize_entity 函数。如果它拉入所有子实体(参考属性),那么它将一次做一个(因此有很多获取)。

如果您希望使用批量获取来预取引用的实体 - 请查看 Nick Johnson 的 prefetch_refprop 博客文章。

或者修改 deserialize_entities 以不获取不需要的引用属性

于 2012-07-04T02:23:52.577 回答