使用大型ZIP包的Node Express Zip创建流程

时间:2017-05-23 14:30:34

标签: node.js express zip jszip node-archiver

目标

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

问题&设计约束

  • 生成的ZIP可能大约为50 MB - 5 GB。所以我们想 在ZIP存在时为用户提供正在运行的进度条 建造。 (我们假设浏览器将提供运行更新 实际下载的进度)。
  • 虽然我们预计会有少量请求 (1-2次请求)。但是,我们不想完全捆绑我们的4 核心服务器处理器,因此我们希望最小化绑定快速服务器的同步调用。
  • 鉴于ZIP的大小,我们不能指望zip只能在内存中组装
  • 我们应该担心还有其他问题吗?

问题

我们假设将7zip作为子进程运行是不好的,因为我们无法获得有关已将多少258KB文件添加到ZIP中的任何运行状态。

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

我上面看到的是,大多数软件包首先收集文件,然后将它们最终化为内存,然后将它们传输到http请求(可能不适合5GB的数据,或者我错过了什么)。有些人似乎能够使用磁盘,但问题是在添加每个文件时是否会获得更新事件?

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

2 个答案:

答案 0 :(得分:1)

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

  • JSZIP主要用于浏览器
  • EasyZip是JSZIP的节点包装器,但它没有提供 创作进度通知
  • Express-Zip是一种内存中快速友好的RES解决方案(但是 可能不会处理我们正在谈论的ZIP的大小)
    • ZIP-Stream是底层实用程序underleath Archiver。 Archiver有 排队服务,所以应该只是用户归档
  • YAZL可能有效,但界面对于进度来说更复杂 追踪比Archiver

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

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

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

  • 在溪流中找到字符串很麻烦
  • 导致上下文切换读取流
  • 你有一个脆弱的解决方案试图处理输出流输出的内容(例如,在7zip的情况下,它有时会使计数器有效率提高30%),以及脆弱解决方案的其他来源。

答案 1 :(得分:0)

  

我们假设将7zip作为子进程运行是不好的,因为我们无法获得有关已将多少258KB文件添加到ZIP中的任何运行状态。

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

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

7z a -bsp1 -bb3 test.7z *

因此,您可以使用子进程模块从node.js启动它,并且您应该能够捕获stdout进度。您需要使用spawn,而不是exec,以便您可以实时获取stdout数据。

将此作为子进程运行将使nodejs进程可以自由地为其他请求提供服务,并允许子进程管理自己的内存,而与nodejs无关。

7zip程序处理具有适当内存使用量的极大档案和文件。使用正确的标志来进行stdout并将其作为子进程运行,它似乎满足您的所有要求。