L’utilizzo dei dati buffer over stage stage buffer supera il limite interno

Usando il codice:

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

Il conteggio stampa 2043484 e stampa tutti i all_reviews[0] .

Tuttavia, quando si stampa all_reviews[2000000] , ottengo l’errore:

pymongo.errors.OperationFailure: errore del database: errore runner: l’utilizzo dei dati buffer overflow dello stage di ordinamento di 33554495 byte supera il limite interno di 33554432 byte

Come gestisco questo?

Stai eseguendo il limite di 32 MB su un ordinamento in memoria:

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

Aggiungi un indice al campo di ordinamento. Ciò consente a MongoDB di eseguire lo streaming di documenti in ordine ordinato, piuttosto che tentare di caricarli tutti in memoria sul server e ordinarli in memoria prima di inviarli al client.

Come detto da kumar_harsh nella sezione commenti, vorrei aggiungere un altro punto.

È ansible visualizzare l’attuale utilizzo del buffer utilizzando il comando seguente sul database di admin :

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

Ha un valore predefinito di 32 MB (33554432 byte) . In questo caso si stanno esaurendo i dati del buffer in modo da poter aumentare il limite del buffer con il proprio valore ottimale definito, ad esempio 50 MB come di seguito:

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

Possiamo anche impostare questo limite in modo permanente tramite il parametro seguente nel file di configurazione di mongodb:

 setParameter=internalQueryExecMaxBlockingSortBytes=309715200 

Spero che questo ti aiuti !!!

Note : questo comando supporta solo dopo la versione 3.0 +

risolto con l’indicizzazione

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

Se si desidera evitare di creare un indice (ad esempio, si desidera semplicemente un controllo rapido e accurato per esplorare i dati), è ansible utilizzare l’aggregazione con l’utilizzo del disco:

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

(Non sono sicuro di come farlo in pymongo, però).

Nel mio caso, è stato necessario correggere gli indici del nessario nel codice e ricrearli:

 rake db:mongoid:create_indexes RAILS_ENV=production 

Poiché l’overflow della memoria non si verifica quando c’è un indice di campo necessario.

PS Prima di questo ho dovuto disabilitare gli errori durante la creazione di indici lunghi:

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

Sintassi dell’API JavaScript per l’indice:

 db_handle.ensureIndex({executedDate: 1})