限制工作负载以控制内存使用

时间:2015-06-25 20:50:38

标签: javascript node.js

我有一个网络应用程序。在每个请求中,它将整个文件加载到内存中并执行与其内容异步的操作。

为了避免内存不足,我想限制我可以同时处理的文件数量。如果文件的大小是不变的并且是预先知道的,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();
    });
}

1 个答案:

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