Подтвердить что ты не робот

Google App Engine: курсор и смещение

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

1.Cursor

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, кажется, что курсор не добавляет служебные данные смещения запроса.

4b9b3361

Ответ 1

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

В хранилище данных выбирается смещение + предел результаты для приложения. Первый результаты смещения не пропускаются само хранилище.

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

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

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

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