MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Manière de réduire l'utilisation de la mémoire par la mangouste lors de la requête

Mangouste par défaut .find() renvoie bien sûr tous les résultats sous la forme d'un "tableau", donc cela va toujours utiliser de la mémoire avec des résultats volumineux, donc cela laisse l'interface "flux".

Le problème de base ici est que vous utilisez un flux interface (car celle-ci hérite du flux de nœud de base), chaque événement de données "se déclenche" et le gestionnaire d'événements associé est exécuté en continu.

Cela signifie que même avec un "flux", vos actions ultérieures dans le gestionnaire d'événements "s'empilent", consommant au moins beaucoup de mémoire et consommant éventuellement la pile d'appels si d'autres processus asynchrones sont déclenchés.

Donc, la meilleure chose que vous puissiez faire est de commencer à "limiter" les actions dans votre traitement de flux. C'est aussi simple que d'appeler le .pause() méthode :

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

Donc .pause() arrête l'émission des événements dans le flux et cela permet aux actions de votre gestionnaire d'événements de se terminer avant de continuer afin qu'elles n'arrivent pas toutes en même temps.

Lorsque votre code de gestion est terminé, vous appelez .resume() , soit directement dans le bloc, comme illustré ici, soit dans le bloc de rappel de toute action asynchrone effectuée dans le bloc. Notez que les mêmes règles s'appliquent aux actions asynchrones et que "tout" doit signaler la fin avant que vous ne deviez appeler resume.

Il existe d'autres optimisations qui peuvent également être appliquées, et vous feriez bien de rechercher des modules disponibles de "traitement de file d'attente" ou de "contrôle de flux asynchrone" pour vous aider à obtenir plus de performances avec une exécution parallèle de cela.

Mais pensez essentiellement .pause() puis traitez et .resume() pour continuer à éviter de consommer beaucoup de mémoire dans votre traitement.

Soyez également conscient de vos "sorties" et essayez de la même manière d'utiliser à nouveau un "flux" si vous construisez quelque chose pour une réponse. Tout cela ne servira à rien si le travail que vous faites consiste simplement à créer une autre variable en mémoire, il est donc utile d'en être conscient.