Como aumentar o limite de dados em buffer?

16

No Ubuntu, criei uma coleção MongoDB Db contendo 1 milhão de registros e, ao tentar executar um comando de classificação, estou recebendo o seguinte erro:

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

Por favor, alguém pode descrever como aumentar o limite interno para que eu possa executar este e alguns outros comandos em grande escala contra os dados?

Jon295087
fonte
Eu duvido que você possa. O problema provavelmente está na sua declaração: EXPLAIN mostra que você está usando um INDEX? Caso contrário, você precisará adicionar um INDEX à sua tabela.
Rinzwind
Oi Rinzwind. Estou tentando comparar o desempenho, então estou procurando executar tipos de dados usando noindex, índice primário e um índice secundário. Você está sugerindo que não é possível executar uma espécie dessa escala sem um índice?
Jon295087
Ah Bem, eu costumo examinar o desempenho usando EXPLAIN (assim que EXPLAIN não me dá um número baixo de contagens, o desempenho é ruim). Você provavelmente precisará limitar seus registros se quiser fazer assim.
Rinzwind
Descobri que o MongoDB processará cerca de 25.000 documentos neste conjunto de dados, mas cai com algo maior ... Acho que é apenas uma limitação do banco de dados? Obrigado por seus comentários.
Jon295087

Respostas:

23

Isso pode acontecer devido a um bug como o SERVER-13611 (portanto, verifique se você está na versão mais recente) ou porque você está tentando classificar em um índice esparso no 2.6 , mas mais geralmente é porque você está simplesmente tentando classificar também muitos registros na memória sem um índice.

O limite específico que você está atingindo é intencional e está documentado aqui - ele não pode ser alterado, portanto, é necessário reduzir o conjunto de resultados ou usar um índice etc. para realizar a classificação.

Atualização (novembro de 2014): A próxima versão 2.8 (2.8.0-rc0 no momento em que foi escrita isso) agora permite que essa configuração seja alterada, da seguinte maneira:

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

O valor padrão é 32MiB (33554432 bytes) e deve ser ajustado com cuidado - classificações grandes na memória podem fazer com que seu banco de dados fique parado (é por isso que houve um limite em primeiro lugar).

Adam C
fonte
"errmsg": "nenhuma opção encontrada para set, o uso de ajuda: true para ver as opções"
Mohammad Efazati
11
provavelmente você está usando uma versão muito diferente da resposta pretendida, isso foi escrito há algum tempo
C Adam C #
2

Também me deparei com o problema ao classificar e paginar 200K + registros. A solução mais fácil parece ser adicionar um índice (para os atributos que você está classificando.

max kaplan
fonte