gpt4 book ai didi

node.js - 使用 Node Express 处理大型 ZIP 包的 Zip 创建流程

转载 作者:太空宇宙 更新时间:2023-11-04 00:22:17 25 4
gpt4 key购买 nike

目标

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

问题和设计限制

  • 生成的 ZIP 大小可能约为 50 MB - 5 GB。因此我们希望在 ZIP 压缩过程中为用户提供一个正在运行的进度条建。 (我们假设浏览器将提供有关以下内容的运行更新实际下载的进度)。
  • 虽然我们预计请求量较低(一次 1-2 个请求)。然而,我们不想完全束缚我们的 4核心服务器处理器,因此我们希望最大限度地减少占用 Express 服务器的同步调用。
  • 考虑到 ZIP 的大小,我们不能期望 zip 仅在内存中组装
  • 还有其他我们应该担心的问题吗?

问题

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

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

我在上面看到的是,大多数包首先收集文件,然后将它们最终确定到内存中,然后通过管道将它们传送到 http 请求(可能不适合 5GB 的数据,或者我遗漏了一些东西)。有些似乎能够使用磁盘,但问题是添加每个文件时是否会获取更新事件?

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

最佳答案

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

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

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

  • express 友好
  • 内存占用低
  • 对于我们创建的特定图像存档,速度与 7ZIP 一样快(我们不需要压缩、文件很大等)。对于其他类型的存档,性能可能会下降 25%
  • 它不允许您追加到现有存档(这是我们想要的功能之一),但 adm-zip 可能会提供这一空白

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

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

关于node.js - 使用 Node Express 处理大型 ZIP 包的 Zip 创建流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44137677/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com