Nodejs错误:EMFILE

时间:2012-11-02 09:37:07

标签: javascript node.js express

我需要打开一个包含文件的目录..打开每个文件的读取流,并将所有文件中的数据写入单个文件。但我一直得到错误:EMFILE,打开'chunks / piece96.data'

我的ulimit是256,我将它增加到1024.我在目录中有127个文件可以打开,读取和写入单个文件。

我的代码在

下面


    var DIR='chunks/';
    var files=fs.readdirSync(DIR);
    var filename='bach.mp3';

    files.forEach(function(singlebit){
        //console.log(files);
        var bit=fs.createReadStream(DIR+singlebit);
        var resultfile=fs.createWriteStream(filename,{
            flags:'r+',
            encoding:null,
            mode:0666
        });
        bit.on('data',function(bitdata){ 
                resultfile.write(bitdata); 
                console.log(bitdata);
            }).on('end',function(){
                resultfile.end();
            });
        });
    console.log('file complete');

如何防止EMI文件错误。由于我使用readdirSync而不是一次打开所有文件,因此我不会立即打开多个文件。我需要一种方法来读取所有文件并写入单个文件。

1 个答案:

答案 0 :(得分:3)

我刚刚写完了一小段代码来解决这个问题,我不使用流,但这应该适合您的需求:

// Queuing reads and writes, so your nodejs script doesn't overwhelm system limits catastrophically
global.maxFilesInFlight = 100; // Set this value to some number safeish for your system
var origRead = fs.readFile;
var origWrite = fs.writeFile;

var activeCount = 0;
var pending = [];

var wrapCallback = function(cb){
    return function(){
        activeCount--;
        cb.apply(this,Array.prototype.slice.call(arguments));
        if (activeCount < global.maxFilesInFlight && pending.length){
            console.log("Processing Pending read/write");
            pending.shift()();
        }
    };
};
fs.readFile = function(){
    var args = Array.prototype.slice.call(arguments);
    if (activeCount < global.maxFilesInFlight){
        if (args[1] instanceof Function){
            args[1] = wrapCallback(args[1]);
        } else if (args[2] instanceof Function) {
            args[2] = wrapCallback(args[2]);
        }
        activeCount++;
        origRead.apply(fs,args);
    } else {
        console.log("Delaying read:",args[0]);
        pending.push(function(){
            fs.readFile.apply(fs,args);
        });
    }
};

fs.writeFile = function(){
    var args = Array.prototype.slice.call(arguments);
    if (activeCount < global.maxFilesInFlight){
        if (args[1] instanceof Function){
            args[1] = wrapCallback(args[1]);
        } else if (args[2] instanceof Function) {
            args[2] = wrapCallback(args[2]);
        }
        activeCount++;
        origWrite.apply(fs,args);
    } else {
        console.log("Delaying write:",args[0]);
        pending.push(function(){
            fs.writeFile.apply(fs,args);
        });
    }
};