tutorial practices indexes index for create best mongodb mongodb-query mongodb-indexes

practices - mongodb indexes tutorial



El uso de datos almacenados en la etapa de clasificación de desbordamiento excede el límite interno (6)

Usando el código:

all_reviews = db_handle.find().sort(''reviewDate'', pymongo.ASCENDING) print all_reviews.count() print all_reviews[0] print all_reviews[2000000]

El recuento imprime 2043484 e imprime all_reviews[0] .

Sin embargo, al imprimir all_reviews[2000000] , all_reviews[2000000] el error:

pymongo.errors.OperationFailure: error de la base de datos: error del corredor: desbordamiento el uso de datos almacenados en búfer en la etapa de clasificación de 33554495 bytes supera el límite interno de 33554432

¿Cómo manejo esto?


Como dijo kumar_harsh en la sección de comentarios, me gustaría agregar otro punto.

Puede ver el uso actual del búfer utilizando el siguiente comando sobre la base de datos de admin :

> use admin switched to db admin > db.runCommand( { getParameter : 1, "internalQueryExecMaxBlockingSortBytes" : 1 } ) { "internalQueryExecMaxBlockingSortBytes" : 33554432, "ok" : 1 }

Tiene un valor predeterminado de 32 MB (33554432 bytes) . En este caso, se están quedando sin datos del búfer para que pueda aumentar el límite del búfer con su propio valor óptimo definido, por ejemplo 50 MB como se muestra a continuación:

> db.adminCommand({setParameter: 1, internalQueryExecMaxBlockingSortBytes:50151432}) { "was" : 33554432, "ok" : 1 }

También podemos establecer este límite de forma permanente mediante el siguiente parámetro en el archivo de configuración mongodb:

setParameter=internalQueryExecMaxBlockingSortBytes=309715200

Espero que esto ayude !!!

Note : Este comando solo es compatible después de la versión 3.0 +


En mi caso, fue necesario arreglar los índices necesarios en el código y recrearlos:

rake db:mongoid:create_indexes RAILS_ENV=production

Como el desbordamiento de memoria no ocurre cuando hay un índice de campo necesario.

PD: antes de esto tuve que deshabilitar los errores al crear índices largos:

# mongo MongoDB shell version: 2.6.12 connecting to: test > db.getSiblingDB(''admin'').runCommand( { setParameter: 1, failIndexKeyTooLong: false } )

También puede ser necesario reIndex :

# mongo MongoDB shell version: 2.6.12 connecting to: test > use your_db switched to db your_db > db.getCollectionNames().forEach( function(collection){ db[collection].reIndex() } )


Estás llegando al límite de 32 MB en una ordenación en memoria:

https://docs.mongodb.com/manual/reference/limits/#Sort-Operations

Agregue un índice al campo de clasificación. Eso le permite a MongoDB transmitirle documentos en orden ordenado, en lugar de intentar cargarlos todos en la memoria del servidor y ordenarlos en la memoria antes de enviarlos al cliente.


Si desea evitar crear un índice (por ejemplo, solo desea una comprobación rápida y sucia para explorar los datos), puede usar la agregación con el uso del disco:

all_reviews = db_handle.aggregate([{$sort: {''reviewDate'': 1}}], {allowDiskUse: true})

(Sin embargo, no estoy seguro de cómo hacer esto en pymongo).


Sintaxis de la API de JavaScript para el índice:

db_handle.ensureIndex({executedDate: 1})


resuelto con indexación

db_handle.ensure_index([("reviewDate", pymongo.ASCENDING)])