首页 > 解决方案 > 是否可以并行下载和解压缩?

问题描述

我有一些大型 zip 文件正在下载,然后在我的程序中解压缩。性能很重要,我开始考虑的一个方向是是否可以开始下载,然后在数据到达时开始解压缩,而不是等待下载完成然后开始解压缩。这可能吗?根据我对 DEFLATE 的理解,理论上应该是可行的吧?

我目前使用 DotNetZip 作为我的 zip 库,但它拒绝对不可搜索的流采取行动。

代码将是这样的:

// HTTP Get the application from the server
var request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);
request.Method = "GET";

Directory.CreateDirectory(localPath);
using (var response = (HttpWebResponse)request.GetResponse())
using (Stream input = response.GetResponseStream())
{
    // Unzip being some function which will start unzipping and
    // return when unzipping is done
    return Unzip(input, localPath);
}

标签: c#parallel-processingzipdotnetzip

解决方案


我开始考虑是否可以开始下载,然后在数据到达时开始解压缩,而不是等待下载完成然后开始解压缩。这可能吗?

如果您想在响应正文仍在下载时开始解压缩,则无法真正做到这一点。

在 ZIP 文件中,包含 ZIP 文件中文件列表的中央目录记录位于 ZIP 文件的最后。这将是您下载的最后一个东西。没有它,您将无法可靠地确定各个文件记录在 ZIP 文件中的位置。

这也可以解释为什么 DotNetZip 需要可搜索的流。它需要能够首先读取文件末尾的中央目录记录,然后跳回前面的部分以读取有关单个 ZIP 条目的信息以提取它们。

如果您有非常具体的 ZIP 文件,您可以对这些单个文件记录的布局做出某些假设并手动提取它们,而无需向后搜索,但它通常不会与 ZIP 文件广泛兼容。


推荐阅读