MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Aumentando o limite de memória para trabalhos agregados do mongodb


Bem, não, não há configuração e se você realmente pensar sobre isso, há uma boa razão para isso. Portanto, se você considerar primeiro o que o agregado está fazendo e o que o MongoDB faz em geral, deve ficar claro.

Isto é o que "deveria" estar na "cabeça" de qualquer pipeline de agregação sensata:
db.collection.aggregate([
    { "$match:{ /* Something here */ } },

E estes são os motivos:

  1. Faz bom sentido para tentar para reduzir o conjunto de trabalho em que você está operando em qualquer Operação.

  2. Este também é o único vez que você tem a oportunidade de usar um índice para ajudar na busca da seleção. O que é sempre melhor do que uma varredura de coleção.

  3. Embora haja um "otimizador" integrado que procura coisas como "projeções" limitando os campos "selecionados", o melhor escrutinador do tamanho do conjunto de trabalho é somente trabalhar nos registros válidos. As correspondências de estágio posterior não são "otimizadas" desta forma.(Veja o ponto 1 )

A próxima coisa a considerar é o comportamento geral do MongoDB. Para que o processo do servidor deseja fazer, é "consumir" como muito da memória da máquina disponível para armazenar os dados do "conjunto de trabalho" (coleções e/ou índice) para "trabalhar" nesses dados dos meios mais eficientes .

Então realmente é nos "melhores interesses" do mecanismo de banco de dados para "gastar" mais de sua alocação de memória dessa maneira. Dessa forma, tanto o seu "agregado" trabalho e todos os outros processos simultâneos têm acesso aos "dados de trabalho" no espaço de memória.

Portanto, "não é ideal" para o MongoDB "roubar" esta alocação de memória longe das outras operações simultâneas apenas para atender sua operação de agregação em execução.

Na seção "programação para requisitos de hardware" termos, bem, você está ciente de que versões futuras permitem que o pipeline de agregação implemente o "uso de disco" para permitir um processamento maior. Você sempre pode implementar SSDs ou outros rápidos tecnologias de armazenamento. E, claro, "10%" de RAM é subjetiva à quantidade de RAM instalada em um sistema. Assim, você sempre pode aumentar este.

O resumo disso é que o MongoDB tem um trabalho real de ser um "datastore concorrente" e faz isso bem. O que não é é um específico "agregação jogador " e não deve ser tratado como tal.

Então, ou "separação" suas cargas de trabalho ou aumente sua especificação de hardware ou simplesmente alterne a grande atividade de "tarefa em execução" para algo que faça concentre-se no trabalho em execução, como um estilo Hadoop "mapReduce" e deixe o MongoDB para seu trabalho de servir os dados.

Ou, claro, altere seu design para simplesmente "pré-agregar" os dados necessários em algum lugar "na gravação" .

Como diz o ditado, "Cavalos para cursos" , ou use suas ferramentas para o que elas projetaram para .