Google App Engine: курсор и смещение - PullRequest
20 голосов
/ 25 августа 2010

Знаете ли вы, какой подход лучше всего подходит для извлечения фрагментов результата из запроса?

1.Курсор

q = Person.all()
last_cursor = memcache.get('person_cursor')
if last_cursor:
    q.with_cursor(last_cursor)
people = q.fetch(100)
cursor = q.cursor()
memcache.set('person_cursor', cursor)

2.Offset

q = Person.all()
offset = memcache.get('offset')
if not offset:
   offset = 0
people = q.fetch(100, offset = offset)
memcache.set('offset', offset + 100)

Читая документацию Google , кажется, что Курсор не добавляет издержки смещения запроса.

1 Ответ

31 голосов
/ 25 августа 2010

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

Хранилище данных извлекает результаты offset + limit для приложения.Результаты первого смещения не пропускаются самим хранилищем данных.

Метод fetch () пропускает результаты первого смещения, а затем возвращает остаток (результаты ограничения).

Запрос имеет характеристики производительности, которыелинейно соответствуют величине смещения плюс предел.

Я не уверен, как это может быть более явным: O (смещение + предел) - производительность big-Oвыборки со смещением.Если в целом (скажем, по нескольким запланированным задачам) вы выбираете миллион элементов по 1000 за раз, когда вы выбираете последние 1000 (со смещением 999000), хранилище данных не пропускает первые 999000 (даже еслиfetch не возвращает их), поэтому влияние на производительность будет ошеломляющим.

Нет такого предостережения, применимого к использованию курсоров: выборка возобновляется точно с того места, где она остановилась, без необходимости повторного извлечения всех (возможно, многих) элементов ужевыбирается вдоль этого курсора в предыдущих запросах.Поэтому при производительности O (предел) истекшее время должно быть произвольно лучше, чем то, которое вы можете получить со смещением, если это смещение становится достаточно большим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...