Python + MongoDB-итерация Курсора слишком медленная

Я на самом деле работаю в проекте поисковой системы.
Мы работаем с python + mongoDb.
У меня есть следующая проблема:

У меня есть курсор pymongo после извлечения команды find () в Mongo db.
Курсор pymongo имеет около 20k результатов.

Я заметил, что итерация над курсором pymongo очень медленная по сравнению с обычной итерацией, например, со списком того же размера.

Я немного бенчмарк:

-итерация по списку строк 20k: 0.001492 секунды
- итерация над курсором pymongo с результатами 20k: 1.445343 секунд

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

есть ли у кого-нибудь идея, почему курсоры pymongo слишком медленные для итерации?
Любая идея о том, как я могу повторить курсор за меньшее время?

некоторые дополнительная информация:

  • Python v2.6
  • PyMongo v1.9
  • MongoDB v1.6 32 бит

4 ответов


помните, что драйвер pymongo не дает вам сразу все результаты 20k. Он делает сетевые вызовы для бэкэнда mongodb для большего количества элементов по мере итерации. Конечно, это будет не так быстро, как список строк. Тем не менее, я бы предложил попытаться настроить курсор batch_size как описано в документах api:


ваша установка pymongo с помощью включенного расширения C?

>>> import pymongo
>>> pymongo.has_c()
True

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

чтобы установить расширения C в Debian, установите заголовки разработки python перед запуском easy install. В моем случае, мне пришлось удалить старую версию из pymongo. Обратите внимание, что это будет компилировать двоичный файл из C, поэтому вам нужны все обычные инструменты. (НКУ и т. д.)

# on ubuntu with pip
$ sudo pip uninstall pymongo
$ sudo apt-get install python-dev build-essential
$ sudo pip install pymongo

размер курсора по умолчанию составляет 4 МБ, а максимальный-16 МБ. вы можете попытаться увеличить размер курсора до этого предела и посмотреть, если вы получите улучшение, но это также зависит от того, что ваша сеть сможет обработать.


Извините, но это очень дикое утверждение без особых доказательств. Вы не предоставляете никакой информации об общих размерах документов. Получение такого объема документа требует как сетевого трафика, так и ввода-вывода на сервере базы данных. Спектакль выдержан " плохо "даже в" горячем " состоянии с теплыми тайниками? Вы можете использовать "mongosniff "для проверки активности" провода "и системных инструментов, таких как" iostat", для мониторинга активности диска на сервере. Кроме "mongostat" дает кучу ценных информация."