Использование меньших операций с хранилищем данных в appengine

Я собираю базовый фотоальбом на appengine с помощью python 27. Я написал следующий метод для извлечения данных изображения из хранилища данных, соответствующего конкретному «приключению». Я использую ограничения и смещения для разбивки на страницы, однако это очень неэффективно. После просмотра 5 страниц (из 5 фотографий на страницу) я уже использовал 16% своих небольших операций с хранилищем данных. Интересно, что я использовал только 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 Solutions collect form web for “Использование меньших операций с хранилищем данных в appengine”

Несколько вещей:

  1. Вам не нужно каждый раз подсчитывать счет, вы можете кэшировать его
  2. То же самое относится к запросу, почему вы все время запрашиваете? кешируйте его также.
  3. Кэшируйте страницы также, вы не должны вычитывать данные на страницу каждый раз.
  4. Вам нужна только blob_key, но вы загружаете весь объект фотографии, попробуйте моделировать его так, чтобы вам не нужно было загружать все атрибуты Photo.

nitpicking: вам не нужны the_photos = None

Способ обработки пейджинга неэффективен, поскольку он проходит через каждую запись до смещения для доставки данных. Вы должны подумать о создании механизмов подкачки, используя методы закладки, описанные Google http://code.google.com/appengine/articles/paging.html .

Используя этот метод, вы просматриваете только те предметы, которые вам нужны для каждой страницы. Я также настоятельно рекомендую вам правильно кэшировать, как это было предложено Shay, и это быстрее и дешевле.

Возможно, вам стоит подумать о переходе на новый API NDB. Его использование фьючерсов, кэшей и аутсорсинга может помочь вам. Явное лучше, чем неявное, но управление данными NDB делает ваш код более простым и понятным.

BTW, вы пытались использовать appstats и посмотреть, как ваши запросы используют ресурсы сервера?

  • Как остановить спайдер после определенного количества запросов?
  • Python \ ufffd после замены китайским контентом
  • Почему map (print, a_list) не работает?
  • импортирует пользовательский модуль python
  • SOCKET ERROR: Соединение отказано
  • Обработка больших файлов в Python
  • Организация большого скрипта python
  • Как получить значащие имена сетевого интерфейса вместо GUID с netifaces под Windows?
  • Python - лучший язык программирования в мире.