Mongoose mặc định .find()
tất nhiên trả về tất cả các kết quả dưới dạng một "mảng", do đó sẽ luôn sử dụng bộ nhớ với các kết quả lớn, vì vậy điều này sẽ rời khỏi giao diện "luồng".
Vấn đề cơ bản ở đây là bạn đang sử dụng luồng giao diện (vì điều này kế thừa từ luồng nút cơ bản) mỗi sự kiện dữ liệu "kích hoạt" và trình xử lý sự kiện liên quan được thực thi liên tục.
Điều này có nghĩa là ngay cả với một "luồng", các hành động tiếp theo của bạn trong trình xử lý sự kiện đang được "xếp chồng" lên, ít tốn nhiều bộ nhớ nhất và có thể ăn hết ngăn xếp cuộc gọi nếu có thêm các quy trình không đồng bộ khác đang được kích hoạt trong đó.
Vì vậy, điều tốt nhất bạn có thể làm là bắt đầu "giới hạn" các hành động trong quá trình xử lý luồng của mình. Điều này đơn giản như gọi .pause()
phương pháp:
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
});
Vì vậy, .pause()
dừng các sự kiện trong luồng đang được phát ra và điều này cho phép các hành động trong trình xử lý sự kiện của bạn hoàn thành trước khi tiếp tục để chúng không đến cùng một lúc.
Khi mã xử lý của bạn hoàn tất, bạn gọi .resume()
, trực tiếp trong khối như được hiển thị ở đây trong khối gọi lại của bất kỳ hành động không đồng bộ nào được thực hiện trong khối. Lưu ý rằng các quy tắc tương tự áp dụng cho các hành động không đồng bộ và "tất cả" phải báo hiệu hoàn thành trước khi bạn gọi tiếp tục.
Có những cách tối ưu hóa khác cũng có thể được áp dụng và bạn có thể làm tốt khi xem mô-đun có sẵn "xử lý hàng đợi" hoặc "kiểm soát luồng không đồng bộ" để hỗ trợ bạn đạt được hiệu suất cao hơn với một số thực thi song song của điều này.
Nhưng về cơ bản hãy nghĩ rằng .pause()
sau đó xử lý và .resume()
để tiếp tục tránh ăn nhiều bộ nhớ trong quá trình xử lý của bạn.
Ngoài ra, hãy lưu ý về "kết quả đầu ra" của bạn và tương tự, hãy thử sử dụng lại "luồng" nếu bạn đang xây dựng nội dung nào đó cho phản hồi. Tất cả điều này sẽ chẳng có ích lợi gì nếu công việc bạn đang làm chỉ thực sự là xây dựng một biến khác trong bộ nhớ, vì vậy, bạn cần nhận thức được điều đó.