Java - 并行化Gzip

时间:2011-10-22 07:42:33

标签: java gzip parallel-processing

我被指派在Java 7中并行化GZip,我不确定哪种可能。

作业是:

  • 使用给定数量的线程并行化gzip
  • 每个线程使用1024 KiB块,使用最后的32 KiB块 前一个块作为字典。有一个选项可以使用否 dicitionary
  • 阅读Stdin和stdout

我尝试过:

  • 我尝试过使用GZIPOutputStream,但似乎没有 孤立和并行化deflate()的方法,我也无法访问 deflater改变字典。我尝试从GZIPOutputStream扩展,但它似乎没有按照我的意愿行事,因为我仍然无法隔离压缩/放气。
  • 我尝试使用Deflater启用了wrap和FilterOutputStream 输出压缩的字节,但我无法压缩它 正确使用GZip格式。我做了所以每个线程都有一个压缩器,它将写入一个字节数组,然后它将写入OutputStream。

我不确定我的方法是否错误或完全采取了错误的方法。有人能指出我为这个项目使用哪个类的正确方向吗?

4 个答案:

答案 0 :(得分:4)

是的,用字典压缩文件无法并行化,因为一切都取决于所有内容。也许你的老师要求你并行化文件夹中多个文件的单个gzipping?这将是并行工作的一个很好的例子。

答案 1 :(得分:4)

正确的并行实现完全符合您的要求:

https://github.com/shevek/parallelgzip

答案 2 :(得分:1)

要使进程并发,您需要拥有可以并发和独立运行的部分代码。大多数压缩算法都是按顺序运行的,其中每个字节都取决于之前的每个字节。

同时进行压缩的唯一方法是更改​​algorythm(使其与现有方法不兼容)

答案 3 :(得分:1)

认为 您可以通过在压缩流中插入适当的重置来实现。我们的想法是gzip 中使用的底层压缩引擎允许重置deflater,目的是让它更容易从流损坏中恢复,但代价是压缩比更差。重置后,deflater将处于已知状态,因此您实际上可以从多个线程(当然,从输入数据中的许多位置)开始,从该状态(与被压缩的内容无关)开始生成压缩chunk并包含执行以下重置时生成的数据,以便将deflater恢复到已知状态。然后,您只需将压缩的碎片重新组装成整个压缩流。 “简单!”(哈!)

我不知道这是否有效,我怀疑整个事情的复杂性将使它不是一个可行的选择,除非你压缩单个非常大的文件。 (如果你有很多文件,那么很多就可以更容易地并行压缩每个文件。)不过,这是我首先尝试的。

(另请注意,gzip格式只是一个带有额外元数据的泄密流。)