MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Modo per ridurre l'utilizzo della memoria da parte della mangusta durante l'esecuzione di query

Mangusta predefinito .find() ovviamente restituisce tutti i risultati come "array", quindi utilizzerà sempre la memoria con risultati di grandi dimensioni, quindi questo lascia l'interfaccia "stream".

Il problema di base qui è che stai usando uno stream interfaccia (poiché eredita dal flusso del nodo di base) ogni evento di dati "si attiva" e il gestore di eventi associato viene eseguito continuamente.

Ciò significa che anche con un "flusso" le tue azioni successive nel gestore di eventi si "accumulano", consumando almeno molta memoria e possibilmente consumando lo stack di chiamate se vengono attivati ​​altri processi asincroni.

Quindi la cosa migliore che puoi fare è iniziare a "limitare" le azioni nell'elaborazione del tuo flusso. Questo è semplice come chiamare .pause() metodo:

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
});

Quindi .pause() interrompe l'emissione degli eventi nel flusso e ciò consente il completamento delle azioni nel gestore eventi prima di continuare in modo che non vengano tutti in una volta.

Quando il codice di gestione è completo, chiami .resume() , direttamente all'interno del blocco come mostrato qui o all'interno del blocco di richiamata di qualsiasi azione asincrona eseguita all'interno del blocco. Tieni presente che le stesse regole si applicano alle azioni asincrone e che "tutto" deve segnalare il completamento prima di poter chiamare il ripristino.

Ci sono anche altre ottimizzazioni che possono essere applicate e potresti fare bene a cercare i moduli disponibili di "elaborazione della coda" o "controllo del flusso asincrono" per aiutarti a ottenere maggiori prestazioni con un'esecuzione parallela di questo.

Ma fondamentalmente pensa a .pause() quindi elabora e .resume() per continuare ad evitare di consumare molta memoria nella tua elaborazione.

Inoltre, sii consapevole dei tuoi "output" e allo stesso modo prova a utilizzare di nuovo un "stream" se stai creando qualcosa per una risposta. Tutto questo non servirà a nulla se il lavoro che stai facendo consiste semplicemente nella creazione di un'altra variabile in memoria, quindi esserne consapevoli.