Nodejs 二进制合并大量文件

发布于 1周前 作者 yibo5220 来自 nodejs/Nestjs

Nodejs 二进制合并大量文件
现在有一个需求,需要把大量文件(数千个)二进制按顺序连接,目前的做法是开一个 write stream 不停往里写入,但是经常 OOM,请问各位有没有什么更好的解决方案,谢谢!

7 回复

试试命令行?

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

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 }参数确保在所有文件都被写入后输出流不会自动关闭。最后,我们在所有文件写入完成后关闭输出流。

这种方法可以有效地处理大量文件,同时避免内存占用过高的问题。

回到顶部