2011-07-28 12 views
0

妥当なパフォーマンスを得るためにアプリケーションデータをモデル化するのは難しいです。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オペレーションを)

    を各トランザクション/人の組み合わせの全てTransactionPersonによるイベントループに関連するすべてのデータを取得するために私が持つイベントの例を持っています

  • 4人
  • 76トランザクション
  • 213 TransactionPerson

そして、一人あたりのこのバランスの概要を示し、すべてのトランザクションがかかるスタートページへの要求:

 
real: 1863ms 
cpu: 6900ms (1769ms real) 
api: 2723ms (94ms real) 

モーメントIですべての人、トランザクション、トランザクション担当者を1つのイベントに対して取得するために3つのRPC要求を行い、アプリケーション内のすべての「リレーショナル」作業を実行します。その理由はCPUのmsがかなり高いからです。

質問:

  1. それは、2723msのAPI CPUはわずか3つのデータストア要求から293個のオブジェクトを取得するのにかかることはかなり高くありませんか?リアルタイムはOK(94ms)ですが、それは私のAPI cpuのクォータから多くの時間がかかりますか?

  2. パフォーマンスを向上させるにはどうすればよいですか?上記の例では今日のReal msは1863ですが、たとえば12人の人がいる場合、時間は3倍になります。これらは受け入れ可能な応答時間ではありません。

ありがとう!

答えて

1

一般的には、最適化を行いたいと考えています。

読み取り時に人の残高を計算する代わりに、書き込み時に変更を計算して非正規化し、計算された残高をPersonエンティティに保存します。

+0

私はmemcacheを使用して非正規化されたデータを格納し、そこからフェッチしました。これにより、読み込みのパフォーマンスが大幅に向上しました。あなたのソリューションはうまくいくと思います。データを読み込むときと同じ速度の利点があり、memcacheソリューションとして追加/書き込み要求が遅くなるため、memcacheを無効にする必要があります。 – thejaz

関連する問題