快速错误:EMFILE,打开文件太多

时间:2012-06-29 01:33:03

标签: node.js express pug

我收到以下非常恼人的错误:

Error: EMFILE, too many open files '/home/savagegames.net/views/index.jade'
at Object.openSync (fs.js:240:18)
at Object.readFileSync (fs.js:128:15)
at View.contents (/home/savagegames.net/node_modules/express/lib/view/view.js:121:13)
at Function.compile (/home/savagegames.net/node_modules/express/lib/view.js:68:45)
at ServerResponse._render (/home/savagegames.net/node_modules/express/lib/view.js:417:18)
at ServerResponse.<anonymous> (/home/savagegames.net/node_modules/express/lib/view.js:318:17)
at /home/savagegames.net/node_modules/express-mongoose/index.js:45:21
at resolve (/home/savagegames.net/node_modules/express-mongoose/index.js:75:12)
at ServerResponse.expressmongoose [as render] (/home/savagegames.net/node_modules/express-mongoose/index.js:37:12)
at /home/savagegames.net/controllers/index_controller.coffee:49:18

我认为Express是一个问题;我该如何解决这个问题?感谢。

2 个答案:

答案 0 :(得分:1)

从我发现的情况来看,当一些错误发生时会发生,而某些文件没有关闭(当然这是一个错误)。在我的例子中,node-postgres错误导致(奇迹般地)耗尽可用描述符。当我删除导致db错误的代码时,EMFILE消失了。

我想它可以在node.js代码中修复 - 它应该在垃圾收集时关闭文件对象。虽然可能会发生这些丢失的文件描述符仍然被其他东西锁定。

答案 1 :(得分:1)

我经历了很多资源,但相关答案在快递文档中:

Class A {
... };

Class B {
... };

Class HardwareDriver {
    public:
        int accessHardware();
};

A a;
B b;
HardwareDriver hd;
pthread_t aThread;
pthread_t bThread;

main() {
    pthread_create(&aThread, NULL, &A::startA, &a);
    pthread_create(&bThread, NULL, &B::startB, &b);

    while (...) { };
    return 0;
}

它真的有很多帮助,特别是很多缓存命中解释,它根本不打开文件。