Я пытаюсь реализовать сводное представление для большого (ish) набора данных с помощью AppEngine.
Моя модель выглядит примерно так:
def TxRecord(db.Model):
expense_type = db.StringProperty()
amount = db.IntegerProperty()
def ExpenseType(db.Model):
name = db.StringProperty()
total = db.IntegerProperty()
В моем хранилище данных содержится 100 тыс. Экземпляров.из TxRecord
и я хотел бы суммировать их по expense_type
.
В sql это было бы что-то вроде:
select expense_type as name, sum(amount) as total
from TxRecord
group by expense_type
То, что я сейчас делаю, использует Python MapReduce framework для итерации по всем TxRecords
с использованием следующего преобразователя:
def generate_expense_type(rec):
expense_type = type.get_or_insert(name, name = rec.expense_type)
expense_type.total += rec.amount
yield op.db.Put(expense_type)
Кажется, это работает, но я чувствую, что должен запустить его, используя shard_count
1, чтобы гарантировать, что общее количество не будет перезаписано одновременными записями.
Есть ли стратегия, которую я могу использовать, чтобы преодолеть эту проблему с помощью AppEngine или это так?