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

Maneira de diminuir o uso de memória pelo mangusto ao fazer a consulta


Mangusto padrão .find() é claro que retorna todos os resultados como um "array", de modo que sempre usará memória com resultados grandes, então isso deixa a interface "stream".

O problema básico aqui é que você está usando um stream interface (já que isso herda do fluxo de nó básico) cada evento de dados "dispara" e o manipulador de eventos associado é executado continuamente.

Isso significa que mesmo com um "stream" suas ações subsequentes no manipulador de eventos estão "empilhando", no mínimo consumindo muita memória e possivelmente consumindo a pilha de chamadas se houver mais processos assíncronos sendo acionados lá.

Portanto, a melhor coisa que você pode fazer é começar a "limitar" as ações em seu processamento de fluxo. Isso é tão simples quanto chamar o .pause() método:
var stream = model.find().stream();   // however you call

stream.on("data",function() {
    // call pause on entry
    stream.pause();

    // do processing
    stream.resume();            // then resume when done
});

Então .pause() interrompe a emissão de eventos no fluxo e isso permite que as ações em seu manipulador de eventos sejam concluídas antes de continuar, para que elas não sejam todas de uma vez.

Quando seu código de manipulação estiver completo, você chama .resume() , seja diretamente dentro do bloco, como mostrado aqui, ou dentro do bloco de retorno de chamada de qualquer ação assíncrona realizada dentro do bloco. Observe que as mesmas regras se aplicam a ações assíncronas e que "all" deve sinalizar a conclusão antes que você chame o resume.

Existem outras otimizações que também podem ser aplicadas, e você pode fazer bem em procurar módulos disponíveis de "processamento de fila" ou "controle de fluxo assíncrono" para ajudá-lo a obter mais desempenho com alguma execução paralela disso.

Mas basicamente pense em .pause() então processe e .resume() para continuar a evitar consumir muita memória em seu processamento.

Além disso, esteja ciente de suas "saídas" e, da mesma forma, tente usar um "fluxo" novamente se estiver criando algo para uma resposta. Tudo isso não valerá nada se o trabalho que você está fazendo é apenas construir outra variável na memória, então ajuda estar ciente disso.