如何使用GZipStream进行多线程压缩/解压缩,而没有非常大的输入上的中间文件

拉多斯拉夫·朱瑞维兹
  • 我想编写一个使用NET 3.5和GZipStream库执行多线程压缩/解压缩的程序。

  • 输入文件非常大(比方说数百GB)

  • 我想在没有任何中间文件的情况下实现这一目标。这是我最初的方法,但要求已更改。

我正在考虑以下方法,并想验证一下它在纸上看起来是否不错:

  1. 从源文件读取并将其拆分为内存中恒定大小的块。

  2. 由于内存有限,请跟踪线程数。

  3. 每个块由单独的线程压缩在内存中。

  4. 这些压缩的块按正确的顺序放入队列。

  5. 有一个线程从队列中读取并将其连接到输出文件中。

  6. 还将一些与压缩块有关的元数据存储在某个地方,稍后将将其放入标头中。我想用它来减压。

完成上述操作后,我对多线程解压缩的想法将是:

  1. 读取有关串联块的元数据文件。

  2. 从压缩文件中读取由元数据定义的块中的数据。

  3. 每个块由内存中的单独线程解压缩。

  4. 这些解压缩的块将以适当的顺序添加到队列中。

  5. 有一个线程将解压缩的块连接成一个统一的输出文件。

以上似乎合理吗?

马克·阿德勒

当然可以。碰巧的是,有效gzip文件的串联也是有效gzip文件。每个不同的可解压缩流称为gzip成员。您的元数据只需要文件中每个流开始处的偏移量即可。

gzip标头的额外块限制为64K字节,因此这可能会限制块的大小,例如,几十到一百兆字节。出于另一个原因,我建议您压缩的数据块至少应至少为几兆字节-以避免降低压缩效率。

串联的一个缺点是您无法全面检查输入的完整性。例如,如果您以某种方式弄乱了成员的顺序,那么在解压缩时将不会检测到该顺序,因为每个成员的完整性检查都会通过,而与顺序无关。因此,您可能需要对未压缩的数据进行全面检查。一个示例是整个未压缩数据的CRC,可以使用zlib's从成员的CRC计算得出crc32_combine()

我想知道您是否从并行解压缩中获得了显着的加速。解压缩通常足够快,以至于它在要读取的大容量存储设备上受I / O约束。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

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

Java:如何在没有中间文件的情况下使用ZipOutputStream压缩byte []

在读取解压缩的文件后进行解压缩和删除时,线程安全

C#重用GZipStream进行多个解压缩

如何压缩仅包含少量数据的非常大的文件

如何预压缩非常大的html文件

如何在python中压缩非常大的文件

如何在原地压缩非常大的文件

解压缩大的.gz文件

无法使用 GZipStream 解压缩文件(不使用 CopyToAsync)

有没有办法使用gradle从文件夹解压缩多个文件?

在zip解压缩上附加现有文件?

如何使用 mrjob.cat 自动解压缩输入?

如何使用applescript和shell解压缩文件,但又没有收到以下错误?

如何使用Boost iostream进行流解压缩

是否可以解压缩具有多个线程的压缩文件?

在Windows上压缩的文件上不使用Linux上的`unzip`来解压缩文件

如何递归解压缩我的所有文件?

使用Python读取矩阵文件(mtx):没有足够的值可解压缩

如何使用存储卷(/ StorageAccessFramework)解压缩文件?

如何使用 NodeJS 即时解压缩托管的 tar 文件

如何使用python解压缩文件

如何使用终端解压缩.tgz文件?

如何使用Scala解压缩zip文件?

如何使用nifi解压缩.7z文件?

如何使用pyunpack解压缩.7z文件?

如何使用nodejs上传zip文件并解压缩?

如何使用cmd解压缩文件?

如何使用Java下载和解压缩ZIP文件