2

我的问题可以用以下语句来描述:

  • 我希望我的程序能够压缩和解压缩选定的文件
  • 我有非常大的文件(20 GB+)。可以安全地假设该大小永远不会适合内存
  • 即使压缩后压缩文件可能仍然无法放入内存
  • 我想使用.NET Framework中的 System.IO.Compression.GzipStream
  • 我希望我的应用程序是并行的

由于我是压缩/解压缩的新手,我对如何做到这一点有以下想法:

我可以使用将文件拆分成块并分别压缩它们。然后将它们合并回一个完整的压缩文件。 图片显示我的想法

关于这种方法的问题 1 - 压缩多个块然后将它们合并在一起会给我正确的结果,即如果我要反转过程(从压缩文件开始,回到解压缩),我会收到相同的原始输入吗?

关于这种方法的问题 2 - 这种方法对您有意义吗?也许你可以指导我去听一些关于这个话题的好讲座?不幸的是,我自己找不到任何东西。

4

1 回答 1

2

您不需要仅仅为了限制内存使用而对压缩进行分块。gzip 被设计为一种流格式,并且需要大约 256KB 的 RAM 来压缩。数据的大小无关紧要。输入可以是一个字节、20 GB 或 100 PB——压缩仍然只需要 256 KB 的 RAM。您只需将未压缩的数据读入,然后将压缩的数据写出,直到完成。

在您的图表中分块输入的唯一原因是利用多个核心进行压缩。这是您的数据量的一个很好的理由。然后,您可以完全按照您的描述进行操作。只要您以正确的顺序组合输出,解压就会重现原始输入。您始终可以连接有效的 gzip 流以生成有效的 gzip 流。我建议您使块相对较大,例如兆字节,以便压缩不会受到分块的明显影响。

减压不能以这种方式进行分块,但它更快,因此即使可以,也几乎没有任何好处。解压通常是 i/o bound。

于 2018-04-23T23:23:04.373 回答