Python + MongoDB - слишком медленная итерация курсора - PullRequest
9 голосов
/ 30 марта 2011

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

У меня есть курсор-пимонго после выполнения команды find () в db монго.
Курсор Pymongo имеет около 20 000 результатов.

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

Я сделал небольшой тест:

-терация по списку из 20 тыс. Строк: 0,001492 секунды
-терация над курсором-пимонго с результатами 20 КБ: 1,445343 секунды

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

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

Дополнительная информация:

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

Ответы [ 4 ]

14 голосов
/ 23 января 2012

Используется ли в вашей установке pymongo прилагаемое расширение C ?

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

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

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

# on ubuntu with pip
$ sudo pip uninstall pymongo
$ sudo apt-get install python-dev build-essential
$ sudo pip install pymongo
11 голосов
/ 30 марта 2011

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

1 голос
/ 20 октября 2011

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

0 голосов
/ 30 марта 2011

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

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