Использование небольших операций с хранилищами данных в appengine
Я собираю базовый фотоальбом на appengine, используя python 27. Я написал следующий метод для извлечения деталей изображения из хранилища данных, соответствующих определенному "приключению". Я использую ограничения и смещения для нумерации страниц, однако это очень неэффективно. После просмотра 5 страниц (из 5 фотографий на страницу) я уже использовал 16% своего Datastore Small Operations. Интересно, что я использовал только 1% операций чтения из хранилища данных. Как я могу сделать это более эффективным для небольших операций хранилища данных - я не уверен, из чего они состоят.
def grab_images(adventure, the_offset=0, the_limit = 10):
logging.info("grab_images")
the_photos = None
the_photos = PhotosModel.all().filter("adventure =", adventure)
total_number_of_photos = the_photos.count()
all_photos = the_photos.fetch(limit = the_limit, offset = the_offset)
total_number_of_pages = total_number_of_photos / the_limit
all_photo_keys = []
for photo in all_photos:
all_photo_keys.append(str(photo.blob_key.key()))
return all_photo_keys, total_number_of_photos, total_number_of_pages
3 ответа
Несколько вещей:
- Вам не нужно каждый раз вызывать счетчик, вы можете его кешировать
- То же самое касается запроса, почему вы все время запрашиваете? кеш это тоже.
- Кэшируйте страницы также, вы не должны рассчитывать данные на страницу каждый раз.
- Вам нужен только blob_key, но вы загружаете весь объект фотографии, попробуйте смоделировать его так, чтобы вам не нужно было загружать все атрибуты Photo.
придирки: тебе не нужны the_photos = None
Способ обработки пейджинга неэффективен, поскольку он проходит каждую запись перед смещением для доставки данных. Вам следует подумать о создании механизмов разбиения на страницы с использованием методов закладок, описанных Google http://code.google.com/appengine/articles/paging.html.
Используя этот метод, вы просматриваете только те элементы, которые вам нужны для каждой страницы. Я также призываю вас кешировать должным образом, как предлагает Шей, это и быстрее, и дешевле.
Возможно, вы захотите перейти на новый NDB API. Его использование фьючерсов, кэшей и автоматических пакетов может вам очень помочь. Явное лучше, чем неявное, но управление деталями в NDB делает ваш код более простым и более читабельным.
Кстати, вы пытались использовать appstats и посмотреть, как ваши запросы используют ресурсы сервера?