我有一个网络应用程序。在每个请求中,它将整个文件加载到内存中并执行与其内容异步的操作。
为了避免内存不足,我想限制我可以同时处理的文件数量。如果文件的大小是不变的并且是预先知道的,async.queue将是完美的。但我不知道文件大小。因此,更准确地说,我真的想限制我当前占用的内存量,而不是指定文件数量的固定限制。
我的问题是,是否有一个图书馆可以让我做这样的事情:
// Use the fictitious Limiter
var limiter = new Limiter(worker, 10 * 1024 * 1024); // limit to 10 MB
// process foo.txt, which we know is 6MB
limiter.push("foo.txt", 6 * 1024 * 1024);
// ask to process bar.txt, but it will be delayed until foo is complete
// because 6 + 6 > 10
limiter.push("bar.txt", 6 * 1024 * 1024);
// The worker is the same as the one used by async.queue
function worker(task, callback){
var filename = task;
//load whole file and do asynchronous stuff with it
doSomething(filename, function(){
// we're done with the file
callback();
});
}
答案 0 :(得分:0)
只需要一个信号量就可以了。见https://github.com/abrkn/semaphore.js
处理内存中文件的代码将遵循以下模式:
var sem = require('semaphore')(10 * 1024 * 1024);
var size = 6 * 1024 * 1024;
processFile("foo.txt", size);
processFile("bar.txt", size);
function processFile(filename, size){
sem.take(size, function(){
console.log(filename);
// Pretend it takes 1 second to deal with file
setTimeout(function(){
sem.leave(size);
}, 1000);
});
}