Nodejs 解压大文件有什么好的解决方案吗?
Nodejs 解压大文件有什么好的解决方案吗?
最近在做 electron 项目,需要兼容 windows 和 macos 系统,使用了很多例如 admzip 等开源项目,但是它们都是加载到内存中处理,导致会提示 Array buffer allocation failed
不知道大文件应该如何处理 2-5gb ? 请问有啥好的解决方案吗
另外不知道 Buffer 清空方法有哪些?
把 7z 的 dll 和 so 分别包成 7z-win.node 和 7z-mac.node,按需加载
或者更糙的,直接把 7z 的 exe 拷进去,命令行调用。
我也考虑自己写一个 dll 进去,但是 mac 无法使用,你说的 7z 的 dll 调用好像可行,但是 so 是啥文件?
#3 so 是 mac 版的 dll
这玩意在哪里呀,我在官方的 git 上木有这个文件貌似
进到这个帖子差点闪瞎眼,然后切回去后,真瞎了…
https://www.npmjs.com/package/tar 用 stream
ttps://www.npmjs.com/package/tar 用 stream
文档完全懵逼,求教方法。例如 显示所有文件列表<br> tar.list({<br> file:filePath<br> },[],(e) => {<br> console.log(e)<br> })<br>
上 libuv
貌似不支持 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);
});
在解压大文件时,还需要注意以下几点:
- 流式处理:不要一次性将整个文件加载到内存中,而是通过流式处理逐块读取和解压数据,以减少内存占用。
- 错误处理:添加错误处理逻辑,以便在解压过程中出现问题时能够及时处理。
- 性能监控:对于非常大的文件,可以监控解压过程的性能,如解压速度和内存使用情况,以确保系统的稳定性。
通过以上方法,你可以在Node.js中高效地解压大文件。