Как смоделировать мое приложение в хранилище данных Google App Engine - PullRequest
0 голосов
/ 28 июля 2011

Мне сложно смоделировать данные своих приложений для получения разумной производительности.

Это приложение, которое отслеживает затраты в группе людей, и сегодня у меня есть следующие объекты:

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)

Проблема в том, что когда я, например, хочу вычислить баланс для каждого человека, мне нужно получить все данные, связанные с событием, и пройти через весь TransactionPerson для каждой комбинации транзакции / персоны (в приведенном ниже примере это ~65 000 операций)

У меня есть пример события с:

  • 4 человека
  • 76 Транзакция
  • 213 TransactionPerson

И запрос к стартовой странице, которая показывает эту сводную информацию о балансе на человека и все транзакции, занимает:

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

В настоящий момент я делаю только 3 запроса RPC, чтобы получить всех людей, транзакций и сотрудников транзакций для события.а затем выполняйте всю «реляционную» работу в приложении, поэтому процессор довольно высок.

Вопросы:

  1. Процессору API 2723ms требуется только для того, чтобы получить 293 объекта из 3 запросов хранилища данных, не правда ли, достаточно высоко?В режиме реального времени все в порядке (94 мс), но это отнимает много от моих квот api cpu?

  2. Как я могу создать это, чтобы получить намного лучшую производительность?Реальная мс сегодня 1863 для этого примера выше, но если есть, например, 12 человек, время утроится.Это недопустимое время ответа.

Спасибо!

1 Ответ

1 голос
/ 28 июля 2011

Как правило, вы хотите оптимизировать для чтения.

Вместо расчета баланса человека во время чтения рассчитывайте изменения во время записи и денормализуйте, сохраняя вычисленный баланс в объекте Person.

...