您可以预压缩数据文件,以便以后插入zip文件以提高性能吗

本文关键字:文件 插入 zip 高性能 压缩 数据 | 更新日期: 2023-09-27 18:36:02

作为安装程序构建的一部分,我们必须将数千个大型数据文件压缩到大约十到二十个"包"中,每个包中有几百个(甚至数千个(文件,这些文件都依赖于与包中的其他文件一起保存。(如果你愿意的话,它们是一起版本的。(

然后,在实际安装过程中,用户选择他们想要包含在系统中的软件包。这也让他们可以将更新作为一个大型版本文件从我们的网站下载到包中,而不是要求他们下载数千个单独的更新,这也可能导致他们与同一包中的其他人不同步。

由于这些都是数据文件,其中一些在设计和编码阶段会定期更改,这意味着我们必须重新压缩该特定zip包中的所有文件,即使只有一个文件发生了更改。这使得我们的安装程序构建的打包步骤每次都要花一个多小时,其中大部分都要重新压缩我们没有接触过的东西。

我们已经考虑过不使用zip包,然后替换其中的特定文件,但从zip中间插入和删除大文件并不能提高我们的性能。(有一点,但还不够,值得。(

我想知道是否有可能将文件预处理为缓存的原始"压缩状态",以匹配它将如何写入zip包,但只有数据本身,而不是zip标头信息等。

我的想法是,如果可能的话,在构建步骤中,我们将首先查找任何没有压缩缓存的数据文件,如果没有,我们将压缩该文件并将结果写入缓存。

接下来,我们只需将所有缓存附加在一个文件流中,添加文件所需的任何适当的zip标头。

这意味着在每次构建过程中,我们仍在重新创建整个zip,但我们只是重新压缩已更改的数据。其余部分将按原样写入,这非常快,因为它是直接写入磁盘。如果数据文件发生更改,其缓存将被销毁,所以下一次构建过程将重新创建它。

然而,我不确定这样的事情是否可能。有没有,如果有,有没有任何文件可以表明人们将如何尝试?

您可以预压缩数据文件,以便以后插入zip文件以提高性能吗

是的,这是可能的。最简单的方法是通过一个条目将每个文件单独压缩到其关联的zip归档中。修改任何文件时,都会替换其关联的zip文件,以保持所有文件都是最新的。然后,您可以编写一个简单的程序来获取一组这些单条目zip文件,并将它们合并到一个zip文件中。您需要参考PKZip应用程序说明中的文档。看看这个。

现在您已经阅读了appnote,您需要做的是使用每个zip文件中的本地标头、数据和中心标头,将本地标头和数据按顺序写入新的zip文件,并将中心标头和本地标头的偏移量保存在新文件中。然后在新文件的末尾保存当前偏移量,使用您保存的中心头写入一个新的中心目录,适当地更新偏移量,并以一个具有中心目录起点偏移量的新中心目录末尾记录结束。

更新:

我觉得这是一个足够有用的东西来写。你可以在这里买到。

您可以先压缩每个文件,然后将它们"压缩"在一起,最后不进行压缩,以将它们快速聚合到可分发的包中。它不会像一次压缩所有数据那样高效,但修改速度应该更快。

我似乎找不到实现此类功能的实际exe。我尝试过的大多数具有合并/更新功能的现有工具似乎都会重新处理(压缩(数据流,正如您已经说过的那样。

然而,如果你或有人想写它,你所描述的似乎是可以完成的。如果你查看这个ZIP文件格式规范的链接,你可以得到你必须解析和处理的结构的概述。看起来你可以很快地从一个文件到另一个文件,收集并丢弃感兴趣的文件,然后合并到新的/更新的文件中。您仍然需要在新的目标归档中重建一个新的中心目录(请参阅上面链接文档的4.3.6节(。

经过进一步的挖掘,DotNetZip Library论坛收到了一条消息,询问相同类型的功能,该消息也像我上面描述的那样进行了描述。它还链接到这个文档,似乎表明对它的支持可能会添加到DotNetZip库中,供您进一步实验。