首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Node创建大型Zip包的ZIP过程

用Node创建大型Zip包的ZIP过程
EN

Stack Overflow用户
提问于 2017-05-23 14:30:34
回答 2查看 2.3K关注 0票数 1

目标

我们站在一个低容量的站点上,用户(浏览器客户端)将选择图像文件(每个文件284 KB ),然后请求Node Express Server将它们捆绑到一个ZIP中,以便下载到web客户端。

问题与设计约束

  • 得到的ZIP可能在50 MB -5 GB左右.因此,在构建ZIP时,我们希望给用户一个正在运行的进度条。(我们假设浏览器将提供正在运行的有关实际下载进度的更新)。
  • 虽然我们期望低数量的请求(一次1-2次请求)。但是,我们不希望完全绑定我们的4核心服务器处理器,因此我们希望最小化绑定快速服务器的同步调用。
  • 考虑到ZIP的大小,我们不能指望zip只在内存中组装。
  • 我们还有什么需要担心的问题吗?

问题

我们假设将7zip作为子进程运行是不好的,因为我们不会获得任何运行状态,不知道有多少258 is文件被添加到ZIP中。

那么,考虑到上面列出的设计约束/目标,以下哪个包是非常友好的Node/ExpressJS包?

我在上面看到的是,大多数包首先收集文件,然后将它们最后保存到内存中,然后将它们传输到http请求(可能对5GB的数据不好,或者我遗漏了什么)。有些人似乎能够使用磁盘,但问题是,当每个文件被添加时,一个会得到更新事件吗?

其他文件似乎是完全异步的,我不知道如何在将每个文件添加到ZIP包时获得运行中的进度值。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-30 14:53:41

上面列出的软件包。大多数都不合适

  • JSZIP主要用于浏览器
  • EasyZip是JSZIP的节点包装器,但它不提供在创建过程中的进度通知。
  • 快递- ZIP是一种内存中的快速友好RES解决方案(但可能无法处理我们正在讨论的ZIP的大小) 。
    • ZIP是底层实用工具,下面是Archiver。归档器具有排队服务,因此应该只使用用户存档器。

  • YAZL可能会工作,但是这个界面比Archiver更复杂,用于进度跟踪。

我们选择了Archiver,因为它具有所需的大部分功能:

  • 表达友好
  • 低内存足迹
  • 对于我们创建的特定图像档案,最快可以达到7ZIP (我们不需要压缩,文件很大,等等)。对于其他类型的档案,您的性能可能有25%的命中率。
  • 它不允许您附加到现有的档案(这是我们想要的一个功能),但adm-zip可能会提供这种差距。

至于7zip解决方案。我们倾向于不喜欢从生成的子进程读取标准输出流的内部。

  • 在他流的字符串中查找字符串很麻烦。
  • 它会导致上下文切换到读取流,
  • 您有一个脆弱的解决方案,试图处理输出流输出的内容(例如,在7zip的情况下,它有时会跳过计数器30%,有时会跳1%),以及脆性解决方案的其他来源。
票数 2
EN

Stack Overflow用户

发布于 2017-05-26 19:25:18

我们假设将7zip作为子进程运行是不好的,因为我们不会获得任何运行状态,不知道有多少258 is文件被添加到ZIP中。

这似乎是一个错误的假设。

在添加每个新文件时,这样的命令行将显示在stdout上添加到存档中的每个文件的进度:

代码语言:javascript
复制
7z a -bsp1 -bb3 test.7z *

因此,您可以使用子进程模块从node.js启动它,并且您应该能够在发生时捕获stdout进度。您需要使用spawn,而不是exec,这样就可以按发生的情况实时获取stdout数据。

将此进程作为子进程运行将保持nodejs进程为其他请求服务的自由,并允许子进程独立于nodejs管理自己的内存。

7zip程序使用适当的内存处理非常大的档案和文件。有了正确的标志,可以获得标准输出的进度,并将其作为子进程运行,它似乎满足了所有的需求。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44137677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档