使用 System.IO.Compressing.Gzip 压缩和解压缩非常大的文件
Compressing and decompressing very large files using System.IO.Compressing.Gzip
我的问题可以用以下语句来描述:
- 我希望我的程序能够压缩和解压缩选定的文件
- 我有非常大的文件 (20 GB+)。可以安全地假设该大小永远不会适合内存
- 即使在压缩之后,压缩文件可能仍然无法放入内存
- 我想使用 .NET Framework
中的 System.IO.Compression.GzipStream
- 我希望我的应用程序是并行的
因为我是压缩/解压的新手,所以我有以下关于如何做的想法:
我可以使用将文件拆分成块并分别压缩每个文件。然后将它们合并回一个完整的压缩文件。
关于此方法的问题 1 - 压缩多个块然后将它们合并回一起会给我正确的结果,即如果我要反转过程(从压缩开始文件,返回解压缩)我会收到相同的原始输入吗?
关于此方法的问题 2 - 您觉得此方法有意义吗?也许您可以指导我就该主题进行一些精彩的演讲?不幸的是我自己找不到任何东西。
您不需要为了限制内存使用而分块压缩。 gzip 被设计成一种流格式,需要大约 256KB 的 RAM 来压缩。数据的大小无关紧要。输入可以是一个字节、20 GB 或 100 PB——压缩仍然只需要 256KB 的 RAM。您只需读入未压缩的数据,然后将压缩的数据写出直到完成。
按照您的图表对输入进行分块的唯一原因是利用多核进行压缩。这是您的数据量的一个很好的理由。然后你就可以完全按照你的描述去做。只要您以正确的顺序组合输出,解压就会重现原始输入。您始终可以连接有效的 gzip 流以生成有效的 gzip 流。我建议您将块设置得相对较大,例如兆字节,因此压缩不会受到分块的明显影响。
解压缩不能以这种方式分块,但它要快得多,所以即使可以,也几乎没有任何好处。解压通常是i/o绑定
我的问题可以用以下语句来描述:
- 我希望我的程序能够压缩和解压缩选定的文件
- 我有非常大的文件 (20 GB+)。可以安全地假设该大小永远不会适合内存
- 即使在压缩之后,压缩文件可能仍然无法放入内存
- 我想使用 .NET Framework 中的 System.IO.Compression.GzipStream
- 我希望我的应用程序是并行的
因为我是压缩/解压的新手,所以我有以下关于如何做的想法:
我可以使用将文件拆分成块并分别压缩每个文件。然后将它们合并回一个完整的压缩文件。
关于此方法的问题 1 - 压缩多个块然后将它们合并回一起会给我正确的结果,即如果我要反转过程(从压缩开始文件,返回解压缩)我会收到相同的原始输入吗?
关于此方法的问题 2 - 您觉得此方法有意义吗?也许您可以指导我就该主题进行一些精彩的演讲?不幸的是我自己找不到任何东西。
您不需要为了限制内存使用而分块压缩。 gzip 被设计成一种流格式,需要大约 256KB 的 RAM 来压缩。数据的大小无关紧要。输入可以是一个字节、20 GB 或 100 PB——压缩仍然只需要 256KB 的 RAM。您只需读入未压缩的数据,然后将压缩的数据写出直到完成。
按照您的图表对输入进行分块的唯一原因是利用多核进行压缩。这是您的数据量的一个很好的理由。然后你就可以完全按照你的描述去做。只要您以正确的顺序组合输出,解压就会重现原始输入。您始终可以连接有效的 gzip 流以生成有效的 gzip 流。我建议您将块设置得相对较大,例如兆字节,因此压缩不会受到分块的明显影响。
解压缩不能以这种方式分块,但它要快得多,所以即使可以,也几乎没有任何好处。解压通常是i/o绑定