Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 限制工作负载以控制内存使用_Javascript_Node.js - Fatal编程技术网

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

Javascript 限制工作负载以控制内存使用,javascript,node.js,Javascript,Node.js,我有一个web应用程序。在每个请求中,它将整个文件加载到内存中,并对其内容执行异步操作 为了避免内存不足,我想限制可以并发处理的文件数量。如果文件的大小是恒定的,并且预先知道,那么这将是完美的。但我不知道文件的大小。因此,更准确地说,我真的想限制我当前占用的内存量,而不是指定一个固定的文件数量限制 我的问题是,是否有一个图书馆可以让我这样做: // Use the fictitious Limiter var limiter = new Limiter(worker, 10 * 1024 * 1

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

为了避免内存不足,我想限制可以并发处理的文件数量。如果文件的大小是恒定的,并且预先知道,那么这将是完美的。但我不知道文件的大小。因此,更准确地说,我真的想限制我当前占用的内存量,而不是指定一个固定的文件数量限制

我的问题是,是否有一个图书馆可以让我这样做:

// 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();
    });
}

这只需要一个信号量。看

然后,处理内存中文件的代码将遵循以下模式:

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

很抱歉因为“对软件库的请求”而偏离主题。不,但是构建自己的软件库很容易,看起来您的示例中有一半的代码…您实际上看到的是一个修改过的信号量。。。选择一个现有的信号量实现,并根据您的需要进行调整(别忘了回馈!),谢谢,@Amit。来自Java世界的我仍然认为信号量是一种多线程的东西。但是,当然,在节点中也可以使用相同的构造。我找到了一个图书馆,实际上可以原封不动地使用它。代码包含在我的答案中。