试图提高我的GAE应用程序的性能

时间:2013-04-20 21:12:16

标签: google-app-engine python-2.7 google-cloud-datastore appstats

我正在尝试使用memcache来提高性能 这是我的模特:

class ABC(db.Model):
   some_property = db.StringProperty()
# more properties

class XYZ(db.Model):
   another_property = db.StringProperty()
   abc = db.ReferenceProperty(ABC,collection_name="xyzs")
# more properties

我只有两个ABC实体和800个XYZ实体 因此,该应用程序的一个功能是为所有XYZ提供excel表。 excel表有两列 第一列是“another_property”,第二列是“some_property”(来自ABC参考)。


xyzs = XYZ.all()
for xyz in xyzs:
   logging.info(xyz.another_property)
   logging.info(xyz.abc.some_property)

通过这种方法,xyz.abc.some_property每次都会进行数据存储调用 Reference property making datstore query

RPC call

看到这个我决定使用memcache将abc引用存储在内存中 在使用memcache的情况下,我没有看到响应时间有任何重大变化。

abcId = XYZ.abc.get_value_for_datastore(xyz).id()
#Get ABC reference from memcache if present else bring it from datastore and add it to memcahce.

Memcache

Memcache RPC

可以取悦某人为什么我没有看到任何性能提升?

2 个答案:

答案 0 :(得分:0)

我试图为每个XYZ实体做一个get memcache。 我通过批量获取memcache来解决它https://developers.google.com/appengine/docs/python/memcache/clientclass#Client_get_multi
伪代码:


abcIds = [str(XYZ.abc.get_value_for_datastore(xyz).id() for xyz in xyzs]
abcs = memcache.get_multi(abcIds) #This gives me a dictionary of id as key and ABC reference property as value

以下是我的应用的改进版本的快照。Improved Memcahce

发布它可能对其他人有帮助。
PS:我有一种感觉,这也可以改善。帮助我改进答案。

答案 1 :(得分:0)

正如您可能会注意到的,如果您开始考虑使用ndb。

现在我的回答是,您应该使用预取引用属性方法,这样可以提高效率,请参阅nick johnson撰写http://blog.notdot.net/2010/01/ReferenceProperty-prefetching-in-App-Engine

它基本上收集引用属性中的所有键,然后对所有实体进行单次获取。您可能会发现它与memcache一样好,如果实体从memcache中被驱逐(将会发生),您将获得所有数据。