最近在做 electron 项目,需要兼容 windows 和 macos 系统,使用了很多例如 admzip 等开源项目,但是它们都是加载到内存中处理,导致会提示 Array buffer allocation failed
不知道大文件应该如何处理 2-5gb ? 请问有啥好的解决方案吗
1
hoythan OP 另外不知道 Buffer 清空方法有哪些?
|
2
whileFalse 2017-08-22 16:24:53 +08:00 1
把 7z 的 dll 和 so 分别包成 7z-win.node 和 7z-mac.node,按需加载
或者更糙的,直接把 7z 的 exe 拷进去,命令行调用。 |
3
hoythan OP @whileFalse 我也考虑自己写一个 dll 进去,但是 mac 无法使用,你说的 7z 的 dll 调用好像可行,但是 so 是啥文件?
|
4
whileFalse 2017-08-22 16:33:00 +08:00 1
@hoythan #3 so 是 mac 版的 dll
|
5
hoythan OP @whileFalse 这玩意在哪里呀,我在官方的 git 上木有这个文件貌似
|
6
sunsulei 2017-08-22 16:50:17 +08:00 1
进到这个帖子差点闪瞎眼,然后切回去后,真瞎了...
|
7
zenxds 2017-08-22 17:04:25 +08:00 1
https://www.npmjs.com/package/tar 用 stream
|
8
noder 2017-08-22 17:09:14 +08:00 1
ttps://www.npmjs.com/package/tar 用 stream
|
9
hoythan OP |
10
yangxiongguo 2017-08-22 17:50:14 +08:00 1
上 libuv
|
13
hoythan OP |
14
whileFalse 2017-08-22 20:52:14 +08:00 1
能上 64 位 nodejs 吗?上了估计能分配足够大的 buffer 了。
|
15
hoythan OP @whileFalse 1g 就差不多崩了,不够稳定。流形式加载貌似也不行
|
16
jianguiqubaa 2017-08-23 13:14:08 +08:00 1
流式加载是让你一边读一边写,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-08-23 13:56:55 +08:00 1
|
19
jianguiqubaa 2017-08-23 13:57:26 +08:00 1
@hoythan 你是男的,还是算了吧
|
20
jianguiqubaa 2017-08-23 14:52:07 +08:00 1
哦, 都不用再 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) 的时候就报错了
|
23
jianguiqubaa 2017-08-23 17:11:17 +08:00 1
|
24
hoythan OP @jianguiqubaa 在 electron 中非常正经的使用解压功能,在 windows 系统下
``` fs.createReadStream(filePath).pipe( tar.x({ strip: 1, C: 'C:\\Users\\hoyt\\Desktop\\' }) ) ``` |
26
jianguiqubaa 2017-08-23 18:43:08 +08:00 1
|