Мне сложно смоделировать данные своих приложений для получения разумной производительности.
Это приложение, которое отслеживает затраты в группе людей, и сегодня у меня есть следующие объекты:
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, чтобы получить всех людей, транзакций и сотрудников транзакций для события.а затем выполняйте всю «реляционную» работу в приложении, поэтому процессор довольно высок.
Вопросы:
Процессору API 2723ms требуется только для того, чтобы получить 293 объекта из 3 запросов хранилища данных, не правда ли, достаточно высоко?В режиме реального времени все в порядке (94 мс), но это отнимает много от моих квот api cpu?
Как я могу создать это, чтобы получить намного лучшую производительность?Реальная мс сегодня 1863 для этого примера выше, но если есть, например, 12 человек, время утроится.Это недопустимое время ответа.
Спасибо!