我正在将超过220K行的数据加载到sqlite3数据库中。每一行数据都存储在一个单独的文件中,因此有超过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
错误。据我所知,我不应该关闭文件,因为显然 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
我该如何解决这个错误?
readFileSync
。也许使用readFile
更有效率,但是一次只处理少量文件。 - Arndt Jonassonprlimit
命令可以显示当前计算机打开文件的限制为1024,但是它可以提高到1048576。或许您也可以这样做。但实际上同时打开如此多的文件是否是个好主意,我不确定。 - Arndt Jonassonfs.readFileSync
解决了这个问题。非常感谢大家。 - punkishfs.readFileSync
只会一次打开一个文件,因为它是一个阻塞进程。 - Aramil Rey