Python + MongoDB – La iteración del cursor es demasiado lenta

En realidad estoy trabajando en un proyecto de motor de búsqueda.
Estamos trabajando con python + mongoDb.
Estoy teniendo el siguiente problema:

Tengo un cursor pymongo después de ejecutar un comando find () a la db mongo.
El cursor de pymongo tiene alrededor de 20k resultados.

He notado que la iteración sobre el cursor de pymongo es realmente lenta en comparación con una iteración normal sobre, por ejemplo, una lista del mismo tamaño.

Hice un pequeño punto de referencia:

-iteración sobre una lista de 20k cadenas: 0.001492 segundos
-iteración sobre un cursor pymongo con 20k resultados: 1.445343 segundos

La diferencia es realmente mucho. Tal vez no sea un problema con esta cantidad de resultados, pero si tengo millones de resultados, el tiempo sería inaceptable.

¿Alguien ha tenido una idea de por qué los cursores de pymongo son demasiado lentos para iterar?
¿Alguna idea de cómo puedo iterar el cursor en menos tiempo?

Alguna información extra:

  • Python v2.6
  • PyMongo v1.9
  • MongoDB v1.6 32 bits

Recuerde que el controlador pymongo no le está devolviendo todos los resultados de 20k a la vez. Se están realizando llamadas de red al backend de mongodb para obtener más elementos a medida que se repite. Por supuesto, no será tan rápido como una lista de cadenas. Sin embargo, sugeriría intentar ajustar el tamaño del cursor batch_size como se describe en los documentos de api :

¿Está su instalación de pymongo usando las extensiones C incluidas?

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

Pasé la mayor parte de la semana pasada tratando de depurar una consulta de tamaño moderado y el procesamiento correspondiente que tardó 20 segundos en ejecutarse. Una vez que se instalaron las extensiones C, todo el mismo proceso tomó aproximadamente un segundo.

Para instalar las extensiones C en Debian, instale los encabezados de desarrollo de Python antes de ejecutar la instalación fácil. En mi caso, también tuve que quitar la versión antigua de pymongo. Tenga en cuenta que esto comstackrá un binario de C, por lo que necesita todas las herramientas habituales. (GCC, etc)

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

el tamaño predeterminado del cursor es de 4 MB, y el máximo al que puede llegar es de 16 MB. puede intentar boost el tamaño del cursor hasta que se scope ese límite y ver si obtiene una mejora, pero también depende de lo que su red pueda manejar.

Lo siento pero esta es una afirmación muy salvaje sin mucha evidencia. No proporciona ninguna información sobre los tamaños generales de los documentos. Obtener tal cantidad de documento requiere tanto tráfico de red como IO en el servidor de la base de datos. ¿El rendimiento se mantiene “mal” incluso en estado “caliente” con cachés calientes? Puede usar “mongosniff” para inspeccionar la actividad “cableada” y las herramientas del sistema como “iostat” para monitorear la actividad del disco en el servidor. Además, “mongostat” da un montón de información valiosa “.