妥当なパフォーマンスを得るためにアプリケーションデータをモデル化するのは難しいです。Google App Engine Datastoreで自分のアプリケーションをモデル化する方法
それは、人々のグループ内のコストを追跡し、今日、私は次のエンティティを持っているアプリケーションです。問題は、私は例えば、一人一人のためにバランスを計算したい場合は、私が持っている
class Event(db.Model):
# Values
name = db.StringProperty(required=True)
password = db.StringProperty(required=True)
class Person(db.Model):
# References
event = db.ReferenceProperty(Event, required=True)
# Values
name = db.StringProperty(required=True)
class Transaction(db.Model):
# References
event = db.ReferenceProperty(Event, required=True)
paidby = db.ReferenceProperty(Person, required=True)
# Values
description = db.StringProperty(required=True)
amount = db.FloatProperty(required=True)
datetime = db.DateTimeProperty(auto_now_add=True)
# This is used because a transaction might not distribute costs
# evenly across all persons belonging to the event
class TransactionPerson(db.Model):
# References
event = db.ReferenceProperty(Event, required=False)
transaction = db.ReferenceProperty(Transaction, required=True)
person = db.ReferenceProperty(Person, required=True)
# Values
amount = db.FloatProperty(required=True)
-
:(〜である以下の例では65.000オペレーションを)
- 4人
- 76トランザクション
- 213 TransactionPerson
を各トランザクション/人の組み合わせの全てTransactionPersonによるイベントループに関連するすべてのデータを取得するために私が持つイベントの例を持っています
そして、一人あたりのこのバランスの概要を示し、すべてのトランザクションがかかるスタートページへの要求:
real: 1863ms cpu: 6900ms (1769ms real) api: 2723ms (94ms real)
モーメントIですべての人、トランザクション、トランザクション担当者を1つのイベントに対して取得するために3つのRPC要求を行い、アプリケーション内のすべての「リレーショナル」作業を実行します。その理由はCPUのmsがかなり高いからです。
質問:
それは、2723msのAPI CPUはわずか3つのデータストア要求から293個のオブジェクトを取得するのにかかることはかなり高くありませんか?リアルタイムはOK(94ms)ですが、それは私のAPI cpuのクォータから多くの時間がかかりますか?
パフォーマンスを向上させるにはどうすればよいですか?上記の例では今日のReal msは1863ですが、たとえば12人の人がいる場合、時間は3倍になります。これらは受け入れ可能な応答時間ではありません。
ありがとう!
私はmemcacheを使用して非正規化されたデータを格納し、そこからフェッチしました。これにより、読み込みのパフォーマンスが大幅に向上しました。あなたのソリューションはうまくいくと思います。データを読み込むときと同じ速度の利点があり、memcacheソリューションとして追加/書き込み要求が遅くなるため、memcacheを無効にする必要があります。 – thejaz