sql >> Databasteknik >  >> NoSQL >> MongoDB

Sätt att minska minnesanvändningen av mongoose när man gör en fråga

Standard mongoose .find() returnerar naturligtvis alla resultat som en "array", så det kommer alltid att använda minne med stora resultat, så detta lämnar "stream"-gränssnittet.

Det grundläggande problemet här är att du använder en ström gränssnitt (eftersom detta ärver från den grundläggande nodströmmen) "avfyras" varje datahändelse och den associerade händelsehanteraren exekveras kontinuerligt.

Detta innebär att även med en "ström" dina efterföljande åtgärder i händelsehanteraren "stackar" upp, åtminstone förbrukar massor av minne och eventuellt äter upp samtalsstacken om det finns ytterligare asynkrona processer som avfyras där.

Så det bästa du kan göra är att börja "begränsa" åtgärderna i din streambearbetning. Detta är så enkelt som att anropa .pause() metod:

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

.pause() stoppar händelserna i strömmen som sänds ut och detta gör att åtgärderna i din händelsehanterare kan slutföras innan de fortsätter så att de inte alla kommer på en gång.

När din hanteringskod är klar ringer du .resume() antingen direkt inom blocket som visas här eller inom callback-blocket för någon asynkron åtgärd som utförs inom blocket. Observera att samma regler gäller för asynkroniseringsåtgärder och att "alla" måste signalera att de är slutförda innan du ringer återuppta.

Det finns andra optimeringar som också kan tillämpas, och du kan göra klokt i att se en "köbearbetning" eller "asynkron flödeskontroll" tillgängliga moduler för att hjälpa dig att få bättre prestanda med lite parallell exekvering av detta.

Men tänk i princip .pause() bearbeta sedan och .resume() för att fortsätta undvika att äta upp mycket minne i din bearbetning.

Var också medveten om dina "utgångar" och försök på liknande sätt att använda en "ström" igen om du bygger upp något för ett svar. Allt detta kommer att vara för intet om arbetet du gör bara bygger upp en annan variabel i minnet, så det hjälper att vara medveten om det.



  1. Kan jag serialisera ett ruby ​​Digest::SHA1-instansobjekt?

  2. Node.js återanvänder MongoDB-referens

  3. MongoDB $addToSet

  4. Keyset(Seek) Paginering i Spring Data MongoDB