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