Come aumentare il limite dei dati bufferizzati?


16

All'interno di Ubuntu ho creato una raccolta di database MongoDB contenente 1 milione di record e quando provo a eseguire un comando di ordinamento su di esso, visualizzo il seguente errore:

 "$err" : "Runner error: Overflow sort stage buffered data usage of 33555002 bytes exceeds internal limit of 33554432 bytes",
 "code" : 17144

Qualcuno può descrivere come aumentare il limite interno in modo da poter eseguire questo e altri comandi su larga scala rispetto ai dati?


Dubito che tu possa. Il problema probabilmente è con la tua affermazione: EXPLAIN mostra che stai usando un INDICE? In caso contrario, è necessario aggiungere un INDICE alla tabella.
— Rinzwind,

Ciao Rinzwind. Sto cercando di confrontare le prestazioni, quindi sto cercando di eseguire una sorta di dati utilizzando noindex, indice primario e un indice secondario. Stai suggerendo che non è possibile eseguire una sorta di scala senza un indice?
— Jon295087,

Ah. Beh, tendo ad esaminare le prestazioni usando EXPLAIN (non appena EXPLAIN non mi dà un numero basso di record, le prestazioni sono cattive). Probabilmente dovrai limitare i tuoi record se vuoi farlo in questo modo.
— Rinzwind,

Ho scoperto che MongoDB elaborerà circa 25000 documenti in questo set di dati, ma cadrà con qualcosa di più grande ... Immagino sia solo una limitazione del database? Grazie per i vostri commenti.
— Jon295087,

Risposte:


23

Questo può accadere a causa di un bug come SERVER-13611 (quindi assicurati di essere sull'ultima versione) o perché stai cercando di ordinare su un indice sparse in 2.6 , ma più di solito è perché stai semplicemente tentando di ordinare anche molti record in memoria senza un indice.

Il limite specifico che stai colpendo è intenzionale ed è documentato qui : non può essere modificato, quindi è necessario ridurre il set di risultati o utilizzare un indice ecc. Per eseguire l'ordinamento.

Aggiornamento (novembre 2014): la prossima versione 2.8 (2.8.0-rc0 al momento della stesura di questo) ora consente di modificare questa impostazione, come segue:

db.adminCommand({setParameter: 1, internalQueryExecMaxBlockingSortBytes: <limit in bytes>})

Il valore predefinito è 32 MiB (33554432 byte) e deve essere regolato con cura: gli ordinamenti in memoria di grandi dimensioni possono causare l'arresto del database (motivo per cui in primo luogo c'era un limite).


"errmsg": "nessuna opzione trovata da impostare, usa help: true per vedere le opzioni"
— Mohammad Efazati

1
probabilmente stai usando una versione molto diversa da quella prevista per questa risposta, questa è stata scritta molto tempo fa
— Adam C

2

Mi sono imbattuto anche nel problema durante l'ordinamento e l'impaginazione dei record 200K +. La soluzione più semplice sembra essere quella di aggiungere un indice (per gli attributi su cui si sta ordinando.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.