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 se imprime 2043484
y se imprime all_reviews[0]
.
Sin embargo, al imprimir all_reviews[2000000]
, aparece el error:
pymongo.errors.OperationFailure: error de base de datos: error de ejecución: el uso de datos almacenados en búfer de la etapa de clasificación de desbordamiento de 33554495 bytes excede el límite interno de 33554432 bytes
¿Cómo manejo esto?
mongodb
mongodb-query
mongodb-indexes
sheetal_158
fuente
fuente
db.adminCommand({setParameter: 1, internalQueryExecMaxBlockingSortBytes: <limit in bytes>})
. Fuente: askubuntu.com/questions/501937/…Como se dijo
kumar_harsh
en la sección de comentarios, me gustaría agregar otro punto.Puede ver el uso actual del búfer usando el siguiente comando sobre la
admin
base de datos:> 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á quedando sin datos del búfer, por lo que puede aumentar el límite del búfer con su propio valor óptimo definido, 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 de mongodb:
setParameter=internalQueryExecMaxBlockingSortBytes=309715200
Espero que esto ayude !!!
Note
: Este comando es compatible solo después de la versión 3.0 +fuente
resuelto con indexación
db_handle.ensure_index([("reviewDate", pymongo.ASCENDING)])
fuente
Si desea evitar la creación de un índice (por ejemplo, solo desea una verificació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).
fuente
db_handle.aggregate(pipe, allowDiskUse=True)
. Consulte esta pregunta para obtener más información.Sintaxis de la API de JavaScript para el índice:
db_handle.ensureIndex({executedDate: 1})
fuente
En mi caso, fue necesario arreglar los índices necesarios en el código y volver a crearlos:
Como el desbordamiento de la 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() } )
fuente