gpt4 book ai didi

node.js - nodejs打开文件太多导致错误

转载 作者:太空宇宙 更新时间:2023-11-03 22:43:23 24 4
gpt4 key购买 nike

我正在将 > 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 ..

});
});
});

上述内容会导致错误:EMFILE:打开文件太多错误。据我了解,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

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

最佳答案

解决方案

您可以通过在出现 EMFILE 错误时立即对 readFile 操作进行排队来解决此问题,并且仅在关闭某些内容后才执行读取,幸运的是,这正是graceful-fs确实如此,因此只需将 fs 模块替换为 graceful-fs 即可解决您的问题

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

问题

由于 Node 的异步性质,您的进程尝试打开的文件数量超过允许的数量 (8192),因此会产生错误。循环中的每次迭代都会开始读取文件,然后立即继续下一次迭代。

要读取它们,文件将被打开,但在读取成功或失败之前不会关闭。

关于node.js - nodejs打开文件太多导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49672964/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com