Nodejs 二进制合并大量文件
Nodejs 二进制合并大量文件
现在有一个需求,需要把大量文件(数千个)二进制按顺序连接,目前的做法是开一个 write stream 不停往里写入,但是经常 OOM,请问各位有没有什么更好的解决方案,谢谢!
试试命令行?
cat 1.txt 2.txt 3.txt > all.txt
cat 4.txt 5.txt 6.txt >> all.txt
应该是读的速度太快,写跟不上就 OOM 了,可以看下这里面的 pipe: http://taobaofed.org/blog/2017/08/31/nodejs-stream/
我想也是这个原因。看了下应该就是我想要的解决方案,谢谢!
Node 里面我不知道怎么搞,不过其他语言一般是开一个固定大小的 buffer,比如 4KB,每次只读这么多,写入这 4KB 以后再读下一个 4KB
pipe?
node 自己的 fs stream 是有 backpressure 处理能力的啊
在Node.js中合并大量文件可以使用流(Streams)来高效处理二进制数据。流是一种处理数据的方式,可以在数据被读取或写入时逐步处理,而不必一次性将整个文件加载到内存中,非常适合处理大文件。
以下是一个示例代码,展示了如何使用Node.js的流模块来合并多个二进制文件:
const fs = require('fs');
const path = require('path');
// 要合并的文件列表
const files = ['file1.bin', 'file2.bin', 'file3.bin'];
const outputFile = 'merged.bin';
// 创建输出文件的写流
const outputStream = fs.createWriteStream(outputFile);
files.forEach((file) => {
// 创建输入文件的读流
const inputStream = fs.createReadStream(path.join(__dirname, file));
// 将读流的数据写入输出流
inputStream.pipe(outputStream, { end: false });
// 在当前文件读取完成后,关闭读流(但不关闭输出流)
inputStream.on('end', () => {
inputStream.close();
});
});
// 在所有文件写入完成后关闭输出流
outputStream.on('finish', () => {
outputStream.close();
console.log('Files have been merged successfully!');
});
在这个例子中,我们使用fs.createReadStream
来读取每个文件,并使用fs.createWriteStream
来创建输出文件。pipe
方法将输入流的数据传输到输出流,{ end: false }
参数确保在所有文件都被写入后输出流不会自动关闭。最后,我们在所有文件写入完成后关闭输出流。
这种方法可以有效地处理大量文件,同时避免内存占用过高的问题。