Nodejs 解压大文件有什么好的解决方案吗?

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

Nodejs 解压大文件有什么好的解决方案吗?

最近在做 electron 项目,需要兼容 windows 和 macos 系统,使用了很多例如 admzip 等开源项目,但是它们都是加载到内存中处理,导致会提示 Array buffer allocation failed

不知道大文件应该如何处理 2-5gb ? 请问有啥好的解决方案吗

27 回复

另外不知道 Buffer 清空方法有哪些?


把 7z 的 dll 和 so 分别包成 7z-win.node 和 7z-mac.node,按需加载
或者更糙的,直接把 7z 的 exe 拷进去,命令行调用。

我也考虑自己写一个 dll 进去,但是 mac 无法使用,你说的 7z 的 dll 调用好像可行,但是 so 是啥文件?

#3 so 是 mac 版的 dll

这玩意在哪里呀,我在官方的 git 上木有这个文件貌似

进到这个帖子差点闪瞎眼,然后切回去后,真瞎了…



文档完全懵逼,求教方法。例如 显示所有文件列表
<br> tar.list({<br> file:filePath<br> },[],(e) =&gt; {<br> console.log(e)<br> })<br>



貌似不支持 zip 文件,只能解压 tar

是支持 zip 的




fs.createReadStream(filePath)
.pipe(tar.x({
cwd:‘C:\Users\hoyt\Desktop\test\’
}))
.on(‘entry’, entry => {console.log(entry.path)})

还是 提示
Array buffer allocation failed

能上 64 位 nodejs 吗?上了估计能分配足够大的 buffer 了。

1g 就差不多崩了,不够稳定。流形式加载貌似也不行

流式加载是让你一边读一边写,x 是解压,on(‘entry’) 的写法还是把所有的东西都读到内存里了,肯定要崩。
只是读文件列表的话用 t

一边读一边解压的话参考文档中这个写法:

fs.createReadStream(‘my-tarball.tgz’).pipe(
tar.x({
strip: 1,
C: ‘some-dir’ // alias for cwd:‘some-dir’, also ok
})
)

https://github.com/npm/node-tar

另外 1.4G 的内存限制是 v8 给的, 通过参数能加大

看这个答案我都想嫁给你了顺便问下有没有办法实现 progress,因为大文件解压需要时间,没有一个 进度 让人觉得时间过的很慢。
笔芯❤️



那就先用 fs.createReadStream 记录 buffer 的大小, 然后 pipe 给 tar,再 pipe 给 fs.createWriteStream

你是男的,还是算了吧

哦, 都不用再 pipe 给 fs.createWriteStream 了,tar 把输出搞定了

fs.createReadStream(‘my-tarball.tgz’)
.pipe(countFileSize) // 通过 countFileSize 记录已经读取过的文件的大小, 用来计算 progress
.pipe(
tar.x({
strip: 1,
C: ‘some-dir’ // alias for cwd:‘some-dir’, also ok
})
)

还是会报错 Array buffer allocation failed 唉,昨天一天没试出来

在 fs.createReadStream(filePath) 的时候就报错了



贴代码出来看看

在 electron 中非常正经的使用解压功能,在 windows 系统下
<br>fs.createReadStream(filePath).pipe(<br> tar.x({<br> strip: 1, <br> C: 'C:\\Users\\hoyt\\Desktop\\'<br> })<br>)<br>

我可能需要 path.normalize 一下 C? 但是小文件没毛病



看了 node-tar 的源码,写入文件的时候各种 writeSync。。。我也是醉了

换这个吧: https://github.com/mafintosh/tar-fs

在Node.js中解压大文件,推荐使用zlib模块,它提供了高效的解压功能,适用于处理大型压缩文件。以下是一个使用zlib模块解压.gz文件的示例代码:

const fs = require('fs');
const zlib = require('zlib');

// 创建读取流和解压流
const input = fs.createReadStream('largefile.gz');
const output = fs.createWriteStream('largefile_unzipped.txt');
const unzip = zlib.createGunzip();

// 使用pipe方法连接输入流、解压流和输出流
input.pipe(unzip).pipe(output);

// 处理完成或出错时的回调(可选)
output.on('finish', () => {
  console.log('解压完成');
});

output.on('error', (err) => {
  console.error('解压出错:', err);
});

在解压大文件时,还需要注意以下几点:

  1. 流式处理:不要一次性将整个文件加载到内存中,而是通过流式处理逐块读取和解压数据,以减少内存占用。
  2. 错误处理:添加错误处理逻辑,以便在解压过程中出现问题时能够及时处理。
  3. 性能监控:对于非常大的文件,可以监控解压过程的性能,如解压速度和内存使用情况,以确保系统的稳定性。

通过以上方法,你可以在Node.js中高效地解压大文件。

回到顶部