node and Error: EMFILE, too many open files

前端 未结 18 1779
终归单人心
终归单人心 2020-11-28 17:58

For some days I have searched for a working solution to an error

Error: EMFILE, too many open files

It seems that many people have the same proble

18条回答
  •  清酒与你
    2020-11-28 18:25

    I just finished writing a little snippet of code to solve this problem myself, all of the other solutions appear way too heavyweight and require you to change your program structure.

    This solution just stalls any fs.readFile or fs.writeFile calls so that there are no more than a set number in flight at any given time.

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

提交回复
热议问题