nodejs太多打开文件会导致错误

时间:2018-04-05 12:55:54

标签: node.js

我正在加载> 220K行进入sqlite3 db。每行存储在单独的文件中,因此> 220K文件。

fs.readdir(dir, {}, (err, files) => {
    files.forEach(file => {

        fs.readFile(path.join(dir, file), 'utf8', (err, data) => {

            //.. process file and insert into db ..

        });
    });
});

以上原因导致Error: EMFILE: too many open files错误。根据我的理解,I shouldn't have to close the files因为显然fs.readFile对文件进行操作并为我关闭它。我在Mac OS X上,我的ulimit设置为8192

$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 8192
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 709
virtual memory          (kbytes, -v) unlimited

我该怎么做才能克服这个错误?

1 个答案:

答案 0 :(得分:5)

正如评论中指出的那样,由于node.js的异步性质而发生此错误

您的进程正在尝试打开超过允许的文件,因此会产生错误。

你可以通过创建一个打开文件队列来解决这个问题,这样他们就永远不会超过限制,这里有一些库可以为你做到这一点:

例如,在您的情况下,只需在开头添加以下代码即可修复错误:

const fs = require('graceful-fs');