Výchozí mongoose .find()
samozřejmě vrátí všechny výsledky jako "pole", takže to bude vždy používat paměť s velkými výsledky, takže to opustí rozhraní "stream".
Základní problém je, že používáte stream rozhraní (jak to dědí ze základního toku uzlů) každá datová událost "spustí" a přidružená obsluha události je vykonávána nepřetržitě.
To znamená, že i při „streamu“ se vaše následné akce v obslužné rutině události „hromadí“, přinejmenším spotřebovávají spoustu paměti a možná zabírají zásobník volání, pokud jsou v něm spouštěny další asynchronní procesy.
Takže to nejlepší, co můžete udělat, je začít „omezit“ akce ve zpracování vašeho streamu. Je to stejně jednoduché jako volání .pause()
metoda:
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
});
Takže .pause()
zastaví vysílání událostí ve streamu, což umožňuje dokončit akce ve vašem obslužném programu události, než budete pokračovat, aby nepřicházely všechny najednou.
Po dokončení manipulačního kódu zavoláte .resume()
, buď přímo v bloku, jak je zde znázorněno, nebo v bloku zpětného volání jakékoli asynchronní akce provedené v rámci bloku. Všimněte si, že stejná pravidla platí pro asynchronní akce a že „vše“ musí signalizovat dokončení, než zavoláte obnovení.
Existují i další optimalizace, které lze použít také, a možná uděláte dobře, když se podíváte na dostupné moduly „zpracování fronty“ nebo „asynchronní řízení toku“, které vám pomohou dosáhnout vyššího výkonu s některým paralelním prováděním tohoto.
Ale v zásadě si představte .pause()
poté zpracujte a .resume()
abyste i nadále nezabírali spoustu paměti při zpracování.
Buďte si také vědomi svých „výstupů“ a podobně zkuste znovu použít „stream“, pokud vytváříte něco pro odpověď. To vše bude k ničemu, pokud vaše práce ve skutečnosti pouze vytváří další proměnnou v paměti, takže je dobré si toho být vědomi.