我正在加载> 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
我该怎么做才能克服这个错误?
答案 0 :(得分:5)
正如评论中指出的那样,由于node.js的异步性质而发生此错误
您的进程正在尝试打开超过允许的文件,因此会产生错误。
你可以通过创建一个打开文件队列来解决这个问题,这样他们就永远不会超过限制,这里有一些库可以为你做到这一点:
例如,在您的情况下,只需在开头添加以下代码即可修复错误:
const fs = require('graceful-fs');