Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java并行Gzip_Java_Gzip_Parallel Processing - Fatal编程技术网

Java并行Gzip

Java并行Gzip,java,gzip,parallel-processing,Java,Gzip,Parallel Processing,我被指派在Java7中并行化GZip,我不确定哪一个是可能的 任务是: 使用给定数量的线程并行化gzip 每个线程使用来自的最后32 KiB块获取1024 KiB块 将上一个块作为字典。有一个选项可以使用no 辩论的 从标准输入和标准输出读取 我所尝试的: 我已经尝试过使用GZIPOutputStream,但似乎没有什么问题 隔离和并行deflate()的方法,也不能访问 修改字典。我尝试扩展GZIPOutputStream,但它似乎没有按照我想要的那样工作,因为我仍然无法隔离压缩/放气

我被指派在Java7中并行化GZip,我不确定哪一个是可能的

任务是:

  • 使用给定数量的线程并行化gzip
  • 每个线程使用来自的最后32 KiB块获取1024 KiB块 将上一个块作为字典。有一个选项可以使用no 辩论的
  • 从标准输入和标准输出读取
我所尝试的:

  • 我已经尝试过使用GZIPOutputStream,但似乎没有什么问题 隔离和并行deflate()的方法,也不能访问 修改字典。我尝试扩展GZIPOutputStream,但它似乎没有按照我想要的那样工作,因为我仍然无法隔离压缩/放气
  • 我尝试使用启用了wrap的Deflater和一个FilterOutputStream来 输出压缩的字节,但我无法将其压缩 正确使用GZip格式。我这样做是为了每个线程都有一个压缩器,它将写入一个字节数组,然后再写入OutputStream

我不确定我的方法是错误的还是完全采取了错误的方法。有人能告诉我这个项目使用哪些类的正确方向吗?

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


并发压缩的唯一方法是更改算法(使其与现有方法不兼容)

是的,用字典压缩文件不能并行化,因为一切都取决于一切。也许你的老师让你将文件夹中多个文件的单独gzip并行化?这将是并行工作的一个很好的例子。

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

我不知道这是否可行,我怀疑整个事情的复杂性将使它成为一个不可行的选择,除非您压缩单个非常大的文件。(如果您有许多文件,那么只需并行压缩其中的每一个文件就会容易得多。)不过,这是我首先要尝试的


(还请注意,gzip格式只是一个包含额外元数据的压缩流。)

一个正确的并行实现,它完全满足您的要求:


这是家庭作业吗?显然,您的意图是从头开始实现它,而不是复制
GZIPOutputStream
。正如你所说,这个类还没有被并行化。GzipOutputStream肯定是Deflater的包装器吗?是的,这是一个家庭作业。我被告知Deflaters应该可以工作,但我似乎无法让它们以GZip格式正确压缩。我也不确定您是否可以通过zlib引擎的Java接口来实现这一点。有可能它没有充分暴露出来。关于如何创建可恢复流的文档也有些粗略……我们应该按顺序读取块,使用之前读取的块的最后32 KiB设置每个块的字典,然后并发压缩。据我所知,并行压缩是一件大事,而且它不是经常使用的东西。我很确定gzip不允许并行化,但是还有其他的压缩格式可以支持它:(并不是说这个实现从来没有进入过主项目,所以我不会把钱花在它上面)