node and Error: EMFILE, too many open files

前端 未结 18 1790
终归单人心
终归单人心 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:16

    You're reading too many files. Node reads files asynchronously, it'll be reading all files at once. So you're probably reading the 10240 limit.

    See if this works:

    var fs = require('fs')
    var events = require('events')
    var util = require('util')
    var path = require('path')
    
    var FsPool = module.exports = function(dir) {
        events.EventEmitter.call(this)
        this.dir = dir;
        this.files = [];
        this.active = [];
        this.threads = 1;
        this.on('run', this.runQuta.bind(this))
    };
    // So will act like an event emitter
    util.inherits(FsPool, events.EventEmitter);
    
    FsPool.prototype.runQuta = function() {
        if(this.files.length === 0 && this.active.length === 0) {
            return this.emit('done');
        }
        if(this.active.length < this.threads) {
            var name = this.files.shift()
    
            this.active.push(name)
            var fileName = path.join(this.dir, name);
            var self = this;
            fs.stat(fileName, function(err, stats) {
                if(err)
                    throw err;
                if(stats.isFile()) {
                    fs.readFile(fileName, function(err, data) {
                        if(err)
                            throw err;
                        self.active.splice(self.active.indexOf(name), 1)
                        self.emit('file', name, data);
                        self.emit('run');
    
                    });
                } else {
                    self.active.splice(self.active.indexOf(name), 1)
                    self.emit('dir', name);
                    self.emit('run');
                }
            });
        }
        return this
    };
    FsPool.prototype.init = function() {
        var dir = this.dir;
        var self = this;
        fs.readdir(dir, function(err, files) {
            if(err)
                throw err;
            self.files = files
            self.emit('run');
        })
        return this
    };
    var fsPool = new FsPool(__dirname)
    
    fsPool.on('file', function(fileName, fileData) {
        console.log('file name: ' + fileName)
        console.log('file data: ', fileData.toString('utf8'))
    
    })
    fsPool.on('dir', function(dirName) {
        console.log('dir name: ' + dirName)
    
    })
    fsPool.on('done', function() {
        console.log('done')
    });
    fsPool.init()
    

提交回复
热议问题