0

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の2つのエンティティとXYZの800エンティティしか持っていません
。このアプリの機能の1つは、すべてのXYZのExcelシートを提供することです。Excel シートには 2 つの列があります。
最初の列は「another_property」で、2 番目の列は「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は、毎回データストア呼び出しを行っていました
データストア クエリを作成する参照プロパティ

RPC 呼び出し

これを見て、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

パフォーマンスの向上が見られないのはなぜですか?

4

2 に答える 2

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

これが私のアプリの改良版のスナップショットです。改善されたメムカフチェ

他の人に役立つかもしれないので投稿します。
PS:これも改善できると感じています。回答の改善にご協力ください。

于 2013-04-20T22:26:28.040 に答える
0

お気づきかもしれませんが、使い始めている場合は、ndb の使用を検討してください。

私の答えとしては、ニック・ジョンソンhttp://blog.notdot.net/2010/01/ReferenceProperty-prefetching-in-App-Engineの記事を参照してください。

基本的に、参照プロパティのすべてのキーを収集し、すべてのエンティティを 1 回取得します。memcache と同様のパフォーマンスが得られる場合があります。さらに、エンティティが memcache から削除された場合 (これは発生します)、すべてのデータを取得できます。

于 2013-04-21T00:11:49.013 に答える