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