MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Начин за намаляване на използването на памет от mongoose при извършване на заявка

Mongoose по подразбиране .find() разбира се връща всички резултати като "масив", така че винаги ще използва памет с големи резултати, така че това напуска интерфейса "поток".

Основният проблем тук е, че използвате поток интерфейс (тъй като това наследява от потока на основния възел) всяко събитие с данни се "задейства" и свързаният манипулатор на събития се изпълнява непрекъснато.

Това означава, че дори и с "поток" последващите ви действия в манипулатора на събития се "натрупват", като най-малкото консумират много памет и евентуално изяждат стека на повикванията, ако има други асинхронни процеси, които се задействат там.

Така че най-доброто нещо, което можете да направите, е да започнете да „ограничавате“ действията при обработката на вашия поток. Това е толкова просто, колкото извикването на .pause() метод:

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() спира излъчваните събития в потока и това позволява действията във вашия манипулатор на събития да завършат, преди да продължат, така че да не идват всички наведнъж.

Когато вашият код за обработка е завършен, вие извиквате .resume() , или директно в блока, както е показано тук, или в блока за обратно извикване на всяко асинхронно действие, извършено в блока. Имайте предвид, че същите правила се прилагат за асинхронни действия и че „всички“ трябва да сигнализира за завършване, преди да извикате възобновяване.

Има и други оптимизации, които също могат да бъдат приложени и може да е добре да потърсите наличните модули за „обработка на опашка“ или „асинхронен контрол на потока“, които да ви помогнат да получите повече производителност с някакво паралелно изпълнение на това.

Но основно помислете за .pause() след това обработете и .resume() за да продължите да избягвате изяждането на много памет при обработката ви.

Също така, имайте предвид вашите „резултати“ и по подобен начин опитайте отново да използвате „поток“, ако изграждате нещо за отговор. Всичко това няма да е напразно, ако работата, която вършите, е просто изграждане на друга променлива в паметта, така че е полезно да сте наясно с това.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да изтриете дълбоко вложен обект в mongodb

  2. Намерете документ на mongodb, като използвате частичен низ _id

  3. как да получите комбинации от елементи в поле за масив в MongoDB?

  4. Обобщено групиране по дата с отместване на лятното часово време

  5. Моделиране на съхранени в mongodb референтни връзки в .net ядро