node js 解压大文件有什么好的解决方案吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hoythan

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

  •  
  •   hoythan 2017 年 8 月 22 日 4611 次点击
    这是一个创建于 3168 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    26 条回复    2017-08-23 18:43:08 +08:00
    hoythan
        1
    hoythan  
    OP
       2017 年 8 月 22 日
    另外不知道 Buffer 清空方法有哪些?
    whileFalse
        2
    whileFalse  
       2017 年 8 月 22 日   1
    把 7z 的 dll 和 so 分别包成 7z-win.node 和 7z-mac.node,按需加载
    或者更糙的,直接把 7z 的 exe 拷进去,命令行调用。
    hoythan
        3
    hoythan  
    OP
       2017 年 8 月 22 日
    @whileFalse 我也考虑自己写一个 dll 进去,但是 mac 无法使用,你说的 7z 的 dll 调用好像可行,但是 so 是啥文件?
    whileFalse
        4
    whileFalse  
       2017 年 8 月 22 日   1
    @hoythan #3 so 是 mac 版的 dll
    hoythan
        5
    hoythan  
    OP
       2017 年 8 月 22 日
    @whileFalse 这玩意在哪里呀,我在官方的 git 上木有这个文件貌似
    lotmany
        6
    lotmany  
       2017 年 8 月 22 日   1
    进到这个帖子差点闪瞎眼,然后切回去后,真瞎了...
    zenxds
        7
    zenxds  
       2017 年 8 月 22 日   1
    noder
        8
    noder  
       2017 年 8 月 22 日   1
    ttps://www.npmjs.com/package/tar 用 stream
    hoythan
        9
    hoythan  
    OP
       2017 年 8 月 22 日
    @zenxds
    @noder
    文档完全懵逼,求教方法。例如 显示所有文件列表
    ```
    tar.list({
    file:filePath
    },[],(e) => {
    console.log(e)
    })
    ```
    yangxiongguo
        10
    yangxiongguo  
       2017 年 8 月 22 日   1
    上 libuv
    hoythan
        11
    hoythan  
    OP
       2017 年 8 月 22 日
    @zenxds
    @noder
    貌似不支持 zip 文件,只能解压 tar
    hoythan
        12
    hoythan  
    OP
       2017 年 8 月 22 日
    @hoythan 是支持 zip 的
    hoythan
        13
    hoythan  
    OP
       2017 年 8 月 22 日
    @zenxds
    @noder

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

    还是 提示
    Array buffer allocation failed
    whileFalse
        14
    whileFalse  
       2017 年 8 月 22 日   1
    能上 64 位 nodejs 吗?上了估计能分配足够大的 buffer 了。
    hoythan
        15
    hoythan  
    OP
       2017 年 8 月 23 日
    @whileFalse 1g 就差不多崩了,不够稳定。流形式加载貌似也不行
    jianguiqubaa
        16
    jianguiqubaa  
       2017 年 8 月 23 日   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 给的, 通过参数能加大
    hoythan
        17
    hoythan  
    OP
       2017 年 8 月 23 日
    @jianguiqubaa 看这个答案我都想嫁给你了顺便问下有没有办法实现 progress,因为大文件解压需要时间,没有一个 进度 让人觉得时间过的很慢。
    笔芯
    jianguiqubaa
        18
    jianguiqubaa  
       2017 年 8 月 23 日   1
    @hoythan

    那就先用 fs.createReadStream 记录 buffer 的大小, 然后 pipe 给 tar,再 pipe 给 fs.createWriteStream
    jianguiqubaa
        19
    jianguiqubaa  
       2017 年 8 月 23 日   1
    @hoythan 你是男的,还是算了吧
    jianguiqubaa
        20
    jianguiqubaa  
       2017 年 8 月 23 日   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
    })
    )
    hoythan
        21
    hoythan  
    OP
       2017 年 8 月 23 日
    @jianguiqubaa 还是会报错 Array buffer allocation failed 唉,昨天一天没试出来
    hoythan
        22
    hoythan  
    OP
       2017 年 8 月 23 日
    @jianguiqubaa 在 fs.createReadStream(filePath) 的时候就报错了
    jianguiqubaa
        23
    jianguiqubaa  
       2017 年 8 月 23 日   1
    hoythan
        25
    hoythan  
    OP
       2017 年 8 月 23 日
    @hoythan 我可能需要 path.normalize 一下 C? 但是小文件没毛病
    jianguiqubaa
        26
    jianguiqubaa  
       2017 年 8 月 23 日   1
    @hoythan

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

    换这个吧: https://github.com/mafintosh/tar-fs
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1004 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 42ms UTC 23:03 PVG 07:03 LAX 16:03 JFK 19:03
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86