sql >> Base de Datos >  >> NoSQL >> MongoDB

Manera de reducir el uso de memoria por mangosta al hacer una consulta

Mangosta por defecto .find() por supuesto, devuelve todos los resultados como una "matriz", por lo que siempre usará memoria con resultados grandes, por lo que deja la interfaz de "flujo".

El problema básico aquí es que está utilizando un stream interfaz (ya que hereda del flujo de nodo básico) cada evento de datos se "dispara" y el controlador de eventos asociado se ejecuta continuamente.

Esto significa que incluso con una "transmisión", sus acciones posteriores en el controlador de eventos se "acumulan", por lo menos consumen mucha memoria y posiblemente consuman la pila de llamadas si hay más procesos asincrónicos que se activan allí.

Entonces, lo mejor que puede hacer es comenzar a "limitar" las acciones en su procesamiento de transmisión. Esto es tan simple como llamar al .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
});

Entonces .pause() detiene la emisión de los eventos en la transmisión y esto permite que las acciones en su controlador de eventos se completen antes de continuar para que no lleguen todas a la vez.

Cuando su código de manejo esté completo, llame a .resume() , ya sea directamente dentro del bloque como se muestra aquí o dentro del bloque de devolución de llamada de cualquier acción asíncrona realizada dentro del bloque. Tenga en cuenta que se aplican las mismas reglas para las acciones asíncronas y que "todos" deben indicar que se completaron antes de llamar a reanudar.

También se pueden aplicar otras optimizaciones, y podría hacer bien en buscar módulos disponibles de "procesamiento de cola" o "control de flujo asíncrono" para ayudarlo a obtener un mayor rendimiento con alguna ejecución paralela de esto.

Pero básicamente piensa en .pause() luego procesar y .resume() para continuar evitando consumir mucha memoria en su procesamiento.

Además, tenga en cuenta sus "salidas" y, de manera similar, intente usar una "secuencia" nuevamente si está creando algo para una respuesta. Todo esto será en vano si el trabajo que está haciendo es en realidad construir otra variable en la memoria, por lo que es útil ser consciente de eso.