【发布时间】:2022-01-01 23:59:40
【问题描述】:
我在流式传输多个文件时遇到了AggregateError: EMFILE: too many open files。
机器详细信息: macOS 蒙特雷, MacBook Pro(14 英寸,2021 年), 芯片 Apple M1 Pro, 内存 16GB, 节点 v16.13.0
我试过增加限制但没有运气。 理想情况下,我希望能够设置一次打开文件数量的限制,或者通过在文件使用后立即关闭来解决。
代码如下。我试图删除不相关的代码并将其替换为'//...'。
const MultiStream = require('multistream');
const fs = require('fs-extra'); // Also tried graceful-fs and the standard fs
const { fdir } = require("fdir");
// Also have a require for the bz2 and split2 functions but editing from phone right now
//...
let files = [];
//...
(async() => {
const crawler = await new fdir()
.filter((path, isDirectory) => path.endsWith(".bz2"))
.withFullPaths()
.crawl("Dir/Sub Dir")
.withPromise();
for(const file of crawler){
files = [...files, fs.createReadStream(file)]
}
multi = await new MultiStream(files)
// Unzip
.pipe(bz2())
// Create chunks from lines
.pipe(split2())
.on('data', function (obj) {
// Code to filter data and extract what I need
//...
})
.on("error", function(error) {
// Handling parsing errors
//...
})
.on('end', function(error) {
// Output results
//...
})
})();
【问题讨论】:
-
有什么理由不只是将 readstream 推送到 files 数组中?您还尝试读取多少个文件?凡事都有其局限
-
有多少个文件?
-
我的原始代码可以处理一个月的数据,其中包含 28,000 个 NDJSON 文件,但是当我尝试处理包含 323,000 个 NDJSON 文件的一年数据时失败了。现在测试建议的代码:D
标签: node.js file stream fs aggregateerror