Оптимизация доступа к хранилищу данных - PullRequest
0 голосов
/ 10 июля 2009

Я пишу небольшую программу для записи прогресса чтения, модели данных просты:

class BookState(db.Model):
    isbn  = db.StringProperty()
    title = db.StringProperty(required=True)
    pages = db.IntegerProperty(required=True)
    img   = db.StringProperty()

class UpdatePoint(db.Model):
    book = db.ReferenceProperty(BookState)
    date = db.DateProperty(required=True)
    page = db.IntegerProperty(required=True)

Класс UpdatePoint записывает, сколько страниц прочитал пользователь за соответствующую дату. Теперь я хочу нарисовать диаграмму из данных, хранящихся в базе данных App Engine, функция выглядит так:

book = db.get(bookkey)
ups = book.updatepoint_set
ups.order('date')

for (i, up) in enumerate(ups):
    if i == 0: continue

    # code begin
    days = (up.date - ups[i-1].date).days
    pages = up.page - ups[i-1].page
    # code end

    # blah blah

Я считаю, что для книги с 40 точками обновления запуск кода будет стоить более 4 секунд. И по прошествии времени я обнаружил, что откомментированный фрагмент кода является причиной плохой производительности. Каждый цикл стоит около 0,08 секунд или более.

Кажется, что UpdatePoint загружается лениво, и он не будет загружен, пока не понадобится. Я хочу знать, есть ли лучшее решение для ускорения доступа к данным, например, выборка данных в кучу.

Большое спасибо за ваш ответ.

Ответы [ 2 ]

3 голосов
/ 10 июля 2009

Кажется, я неправильно использовал класс Query. Мне нужно сначала вызвать ups.fetch (), чтобы получить данные. Теперь код работает намного быстрее, чем раньше:

book = db.get(bookkey)
q = book.updatepoint_set
q.order('date')
ups = q.fetch(50)
0 голосов
/ 10 июля 2009

Из кода видно, что ваше замедление происходит из-за того, что оно в цикле, и его нужно выскочить, чтобы найти нужный объект. Вы пробовали что-то вроде

i = 0
for up in ups:
  if i != 0:
    days = (up.date - previous.date).days
    pages = up.page - previous.page
  i += 1
  previous = up
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...