使用System.IO.Compressing.Gzip压缩和解压缩非常大的文件

时间:2018-04-23 21:18:25

标签: c# .net compression gzipstream system.io.compression

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

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

由于我是压缩/解压缩的新手,我对如何做到了如下:

我可以使用将文件拆分成块并分别压缩它们。然后将它们合并回一个完整的压缩文件。 Picture showing my idea

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

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

1 个答案:

答案 0 :(得分:2)

您不需要压缩压缩只是为了限制内存使用量。 gzip被设计成流式格式,需要大约256KB的RAM来压缩。数据的大小无关紧要。输入可以是一个字节,20 GB或100 PB - 压缩仍然只需要256 KB的RAM。您只需读取未压缩的数据,然后将压缩数据写入完成。

在绘制图表时将输入分块的唯一原因是使用多个内核进行压缩。这是您的数据量的一个非常好的理由。然后你就可以完全按照你的描述去做。只要您按正确的顺序组合输出,解压缩就会重现原始输入。您始终可以连接有效的gzip流以生成有效的gzip流。我建议你把块放得比较大,例如兆字节,因此压缩不会受到分块的显着影响。

减压不能以这种方式分块,但速度要快得多,所以即使可以,也几乎没有任何好处。解压缩通常是i / o绑定。