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)])