MemoryError со слишком большим курсором в PyMongo с разбиением на страницы - PullRequest
0 голосов
/ 20 мая 2018

У меня есть курсор объектов, которые я пытаюсь Paginate.Всего я хочу 25 элементов, но, как работает Pagination с Django, для этого требуется курсор whole .В частном тестировании, предположительно, из-за того, что в моей домашней коробке больше оперативной памяти и тому подобное, у меня нет этих проблем.Однако при загрузке на рабочий компьютер, который имеет только 2 ГБ памяти, я получаю MemoryError, предположительно, потому что курсор слишком большой.

Я могу использовать .limit (25) и .skip (), чтобы получать только 25 объектов одновременно, однако для работы разбивки на страницы мне нужно общее количество объектов.К сожалению, .count (), кажется, требует получения полных данных курсора .В идеале, я могу сделать это, если смогу каким-то образом получить размер подстановки и только 25 реальных объектов из курсора.

Так что я полагаю, вопрос в том, есть ли способ получить размер курсора, которыйне через .count () (который получает данные всего курсора).

lookup = players.find({field: {'$exists': True}}).sort(field, DESCENDING)
//This returns a MemoryError

lookup = players.find({field: {'$exists': True}}).limit(25).skip(25).sort(field, DESCENDING)
//This does NOT return a Memory Error. However, when I do the following:

lookup.count()
//This also has a MemoryError.

Для пояснения я использую Django 1.5.11 и pymongo 3.2.1.

1 Ответ

0 голосов
/ 21 мая 2018

Вместо использования skip() и limit() для нумерации страниц обычно рекомендуется использовать диапазонные запросы .Это связано с тем, что:

  • skip() и limit() должны повторять курсор и отбрасывать результаты, что означает, что вы выполняете много ненужной работы.
  • skip() и limit() не поддерживается индексами.
  • Индексы могут очень эффективно обслуживать запросы диапазона.

Например, вместо skip() и limit() можно использовать диапазонключа.Используя поле id в качестве примера и предполагая, что поле id является возрастающим числом:

db.collection.find({id: {$gte: 0, $lt: 25}, field: {'$exists': True}})

Затем вы можете создать составной индекс из id:1, field:1, например:

db.collection.createIndex({id:1, field:1})

Это сделает нумерацию страниц, поддерживаемую индексом, поэтому она будет быстрой и эффективной, не выполняя никакой ненужной работы.

...