sql >> Database teknologi >  >> NoSQL >> MongoDB

Måde at sænke hukommelsesforbruget af mongoose, når de laver forespørgsler

Standard mongoose .find() returnerer selvfølgelig alle resultater som et "array", så det vil altid bruge hukommelse med store resultater, så dette forlader "stream"-grænsefladen.

Det grundlæggende problem her er, at du bruger en stream interface (da dette arver fra den grundlæggende nodestrøm) "udløses" hver datahændelse, og den tilknyttede hændelseshandler udføres kontinuerligt.

Det betyder, at selv med en "stream" bliver dine efterfølgende handlinger i hændelseshandleren "stablet" op, i det mindste forbruger masser af hukommelse og muligvis æder opkaldsstakken, hvis der er yderligere asynkrone processer, der affyres derinde.

Så det bedste du kan gøre er at begynde at "begrænse" handlingerne i din streambehandling. Dette er så simpelt som at kalde .pause() metode:

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() stopper hændelser i strømmen, der udsendes, og dette gør det muligt for handlingerne i din hændelseshandler at fuldføre, før de fortsætter, så de ikke alle kommer på én gang.

Når din håndteringskode er færdig, ringer du til .resume() , enten direkte inden for blokken som vist her eller inden for tilbagekaldsblokken for enhver asynkron handling udført inden for blokken. Bemærk, at de samme regler gælder for asynkroniseringshandlinger, og at "alle" skal signalere fuldførelse, før du skal kalde genoptage.

Der er andre optimeringer, der også kan anvendes, og du kan gøre klogt i at se en "købehandling" eller "async flow control" tilgængelige moduler for at hjælpe dig med at få mere ydeevne med noget parallel udførelse af dette.

Men tænk grundlæggende .pause() bearbejd derefter og .resume() for fortsat at undgå at æde en masse hukommelse i din behandling.

Vær også opmærksom på dine "outputs" og forsøg på samme måde at bruge en "stream" igen, hvis du bygger noget op til et svar. Alt dette vil være for ingenting, hvis det arbejde, du laver, rent faktisk er at opbygge en anden variabel i hukommelsen, så det hjælper at være opmærksom på det.



  1. mongodump fra ekstern node - ude af stand til at godkende ved hjælp af mekanismen SCRAM-SHA-256

  2. Hvordan opretter man en aggregation fra en liste over AggregationOperation i Spring-data MongoDB?

  3. mongoose index findes allerede med forskellige muligheder

  4. Mongodb $lookup dynamisk samling