sql >> Databáze >  >> NoSQL >> MongoDB

Způsob, jak snížit využití paměti mongoose při provádění dotazu

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.



  1. problémy s php7 mongo dotaz findOne

  2. Pět tipů pro lepší hosting MongoDB v Azure

  3. Mongoose, MongoDB:Jak uložit() dokument po push()?

  4. Aktualizujte/odstraňte dílčí dokument v mongodb pomocí ovladače C#