sql >> Database >  >> NoSQL >> MongoDB

Manier om het geheugengebruik door mangoesten te verlagen bij het uitvoeren van een zoekopdracht

Standaard mangoest .find() retourneert natuurlijk alle resultaten als een "array", dus dat gaat altijd geheugen gebruiken met grote resultaten, dus dit verlaat de "stream"-interface.

Het basisprobleem hier is dat je een stream gebruikt interface (zoals deze erft van de basisnode-stroom) wordt elke data-event "afgevuurd" en de bijbehorende event-handler wordt continu uitgevoerd.

Dit betekent dat zelfs met een "stream" uw volgende acties in de gebeurtenishandler "opstapelen", op zijn minst veel geheugen in beslag nemen en mogelijk de call-stack opeten als er verdere asynchrone processen worden gestart.

Dus het beste wat je kunt doen, is beginnen met het "beperken" van de acties in je streamverwerking. Dit is zo simpel als het aanroepen van de .pause() methode:

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

Dus .pause() voorkomt dat de gebeurtenissen in de stream worden uitgezonden en hierdoor kunnen de acties in uw gebeurtenishandler worden voltooid voordat ze verder gaan, zodat ze niet allemaal tegelijk komen.

Wanneer uw verwerkingscode compleet is, belt u .resume() , ofwel direct binnen het blok zoals hier getoond of binnen het callback-blok van een asynchrone actie die binnen het blok wordt uitgevoerd. Houd er rekening mee dat dezelfde regels van toepassing zijn op asynchrone acties en dat "alle" moet aangeven dat het is voltooid voordat u hervatten kunt bellen.

Er zijn ook andere optimalisaties die kunnen worden toegepast, en u kunt er goed aan doen om een ​​"wachtrijverwerking" of "async flow control" beschikbare modules te bekijken om u te helpen meer prestaties te krijgen met een parallelle uitvoering hiervan.

Maar denk in feite aan .pause() verwerk dan en .resume() om te voorkomen dat u veel geheugen in beslag neemt bij uw verwerking.

Wees je ook bewust van je "outputs" en probeer op dezelfde manier opnieuw een "stream" te gebruiken als je iets opbouwt voor een reactie. Dit alles zal voor niets zijn als het werk dat je doet eigenlijk gewoon een andere variabele in het geheugen opbouwt, dus het helpt om je daarvan bewust te zijn.



  1. Hoe werkt sorteren in de nieuwe mongodb PECL-extensie?

  2. nodejs, redis. controleer of sleutels bestaan ​​en maak nieuwe aan als dat niet het geval is

  3. MongoDB-zelfstudie voor 2022 - Leer wat MongoDB is?

  4. Node.js MongoDB Zoeken met projectie om uit te sluiten _id geeft het nog steeds terug