c# - 是否可以并行下载和解压缩?
问题描述
我有一些大型 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);
}
解决方案
我开始考虑是否可以开始下载,然后在数据到达时开始解压缩,而不是等待下载完成然后开始解压缩。这可能吗?
如果您想在响应正文仍在下载时开始解压缩,则无法真正做到这一点。
在 ZIP 文件中,包含 ZIP 文件中文件列表的中央目录记录位于 ZIP 文件的最后。这将是您下载的最后一个东西。没有它,您将无法可靠地确定各个文件记录在 ZIP 文件中的位置。
这也可以解释为什么 DotNetZip 需要可搜索的流。它需要能够首先读取文件末尾的中央目录记录,然后跳回前面的部分以读取有关单个 ZIP 条目的信息以提取它们。
如果您有非常具体的 ZIP 文件,您可以对这些单个文件记录的布局做出某些假设并手动提取它们,而无需向后搜索,但它通常不会与 ZIP 文件广泛兼容。
推荐阅读
- r - R中列表中矩阵列表的减法
- sql - 需要在Oracle中添加字符串
- ruby-on-rails - 如何在 Rails 6 站点中实现 plyr.js?
- mysql - Linux Ubuntu 18.04 - 加载 MySQLdb 模块时出错。你安装了mysqlclient吗?
- javascript - p5 中的多个画布
- nginx - Nginx 重定向而不是使用 proxy_pass 进行反向代理
- python - 我已经通过 for 循环提供了嵌套列表访问,但我无法获得结果?
- excel - VBA:以 XML 格式保存工作簿但具有相同的工作簿名称
- c++ - 如何在运行时选择迭代器方向
- python - matplotlib 有没有办法使用公制更改轴值的比例?