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.