
最近在做 electron 项目,需要兼容 windows 和 macos 系统,使用了很多例如 admzip 等开源项目,但是它们都是加载到内存中处理,导致会提示 Array buffer allocation failed
不知道大文件应该如何处理 2-5gb ? 请问有啥好的解决方案吗
1 hoythan OP 另外不知道 Buffer 清空方法有哪些? |
2 whileFalse 2017 年 8 月 22 日 把 7z 的 dll 和 so 分别包成 7z-win.node 和 7z-mac.node,按需加载 或者更糙的,直接把 7z 的 exe 拷进去,命令行调用。 |
3 hoythan OP @whileFalse 我也考虑自己写一个 dll 进去,但是 mac 无法使用,你说的 7z 的 dll 调用好像可行,但是 so 是啥文件? |
4 whileFalse 2017 年 8 月 22 日 @hoythan #3 so 是 mac 版的 dll |
5 hoythan OP @whileFalse 这玩意在哪里呀,我在官方的 git 上木有这个文件貌似 |
6 lotmany 2017 年 8 月 22 日 进到这个帖子差点闪瞎眼,然后切回去后,真瞎了... |
7 zenxds 2017 年 8 月 22 日 https://www.npmjs.com/package/tar 用 stream |
8 noder 2017 年 8 月 22 日 ttps://www.npmjs.com/package/tar 用 stream |
9 hoythan OP |
10 yangxiongguo 2017 年 8 月 22 日 上 libuv |
13 hoythan OP |
14 whileFalse 2017 年 8 月 22 日 能上 64 位 nodejs 吗?上了估计能分配足够大的 buffer 了。 |
15 hoythan OP @whileFalse 1g 就差不多崩了,不够稳定。流形式加载貌似也不行 |
16 jianguiqubaa 2017 年 8 月 23 日 流式加载是让你一边读一边写,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 给的, 通过参数能加大 |
17 hoythan OP @jianguiqubaa 看这个答案我都想嫁给你了顺便问下有没有办法实现 progress,因为大文件解压需要时间,没有一个 进度 让人觉得时间过的很慢。 笔芯 |
18 jianguiqubaa 2017 年 8 月 23 日 |
19 jianguiqubaa 2017 年 8 月 23 日 @hoythan 你是男的,还是算了吧 |
20 jianguiqubaa 2017 年 8 月 23 日 哦, 都不用再 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 }) ) |
21 hoythan OP @jianguiqubaa 还是会报错 Array buffer allocation failed 唉,昨天一天没试出来 |
22 hoythan OP @jianguiqubaa 在 fs.createReadStream(filePath) 的时候就报错了 |