在多台主机上使用Java中的zip算法压缩文件

在多台主机上使用Java中的zip算法压缩文件,java,parallel-processing,zip,distributed,deflate,Java,Parallel Processing,Zip,Distributed,Deflate,我的问题是压缩。我必须将文件拆分为多个部分并并行压缩,然后以正确的顺序连接这些部分,并用一个文件另存为zip存档。拆分文件并向主机发送部件不是问题——我使用的是jpvm。我的问题是:如何分割压缩?我曾尝试使用java.util.zip.Deflater压缩每个部分,结果是字节数组,然后将它们写入一个ZipOutStream,但这似乎不起作用-在保存到文件时,它会再次压缩已压缩的字节。我是否必须使用deflater压缩每个部分,然后手动添加zip头、一些校验和之类的东西?Deflater是否添加任

我的问题是压缩。我必须将文件拆分为多个部分并并行压缩,然后以正确的顺序连接这些部分,并用一个文件另存为zip存档。拆分文件并向主机发送部件不是问题——我使用的是jpvm。我的问题是:如何分割压缩?我曾尝试使用java.util.zip.Deflater压缩每个部分,结果是字节数组,然后将它们写入一个ZipOutStream,但这似乎不起作用-在保存到文件时,它会再次压缩已压缩的字节。我是否必须使用deflater压缩每个部分,然后手动添加zip头、一些校验和之类的东西?Deflater是否添加任何标题?谢谢你的帮助,谢谢

不幸的是,您没有显示您的代码,因此我不能确定我是否完全理解您的代码。然而,就我对你的问题的理解而言,我可以向你推荐以下几点

检查原始文件大小并确定块的大小。 开始读取文件,直到达到块大小。阅读时,使用ZipoutStream将内容写入zip。创建带有后缀的文件,以便以后加入内容。后缀应该是运行索引。由于要在多个zip文件中存储一个文件,因此每个zip文件使用一个条目。 在读取zip文件时,只需根据前面看到的后缀对它们进行排序,并读取您的唯一条目,然后将字节从ZipInputSteam复制到您的FileOutputStream。
不幸的是,我不太明白你的多个主机到底是什么意思。你的意思是你的文件太大了,以至于你在不同的机器上同时创建了每个zip吗?如果这是正确的,修改2如下:在读取文件片段时,将其内容发送到远程主机并在那里使用ZipoutStream。若要从特定点读取文件,请使用InputStream.skip。

不幸的是,您没有显示代码,因此我无法确定是否完全理解了您的代码。然而,就我对你的问题的理解而言,我可以向你推荐以下几点

检查原始文件大小并确定块的大小。 开始读取文件,直到达到块大小。阅读时,使用ZipoutStream将内容写入zip。创建带有后缀的文件,以便以后加入内容。后缀应该是运行索引。由于要在多个zip文件中存储一个文件,因此每个zip文件使用一个条目。 在读取zip文件时,只需根据前面看到的后缀对它们进行排序,并读取您的唯一条目,然后将字节从ZipInputSteam复制到您的FileOutputStream。 不幸的是,我不太明白你的多个主机到底是什么意思。你的意思是你的文件太大了,以至于你在不同的机器上同时创建了每个zip吗?如果这是正确的,修改2如下:在读取文件片段时,将其内容发送到远程主机并在那里使用ZipoutStream。要从特定点读取文件,请使用InputStream.skip。

您需要使用Deflater的nowrap选项来生成没有头或尾的原始deflate流。然后,您需要使用适当的zip头和拖车来包装原始的放气流

要在多个处理器上创建单个deflate流,您需要能够使用中的Z_SYNC_flush操作将压缩输出刷新到不是最后一个片段的字节边界。最后一块将正常完成。然后这些片段可以简单地连接起来

Java7(而不是Java6)通过deflate方法的可选第四个参数支持这一点。可以设置为同步\u刷新

以这种方式分解数据将降低压缩,因为每个块不能从前一个块的历史中受益。这可以使用setDictionary方法解决。向每个线程提供要压缩的数据以及其前面32K字节的未压缩数据。然后将32K与setDictionary一起使用,然后使用deflate

您可以看到一个直接使用zlib在C中进行并行压缩的示例

一旦有了deflate流,就可以适当地包装它,使其成为zip文件。看。您还需要计算未压缩数据的长度,以便能够填充这些字段。

您需要使用Deflater的nowrap选项来生成没有标题或拖尾的原始放气流。然后,您需要使用适当的zip头和拖车来包装原始的放气流

要在多个处理器上创建单个deflate流,您需要能够使用中的Z_SYNC_flush操作将压缩输出刷新到不是最后一个片段的字节边界。最后一块将正常完成。然后这些片段可以简单地连接起来

Java7(而不是Java6)通过deflate方法的可选第四个参数支持这一点。可以设置为同步\u刷新

以这种方式分解数据会降低压缩效率 session,因为每个块不能从前一个块的历史中受益。这可以使用setDictionary方法解决。向每个线程提供要压缩的数据以及其前面32K字节的未压缩数据。然后将32K与setDictionary一起使用,然后使用deflate

您可以看到一个直接使用zlib在C中进行并行压缩的示例


一旦有了deflate流,就可以适当地包装它,使其成为zip文件。看。您还需要计算未压缩数据的大小,以便能够填写这些字段。

您是对的-可能我没有足够清楚地描述问题。想法如下:1。父主机正在读取要压缩的文件并将其拆分为多个部分。2.使用jpvm父级将同样大的部分发送到多个主机。3.每个主机并行压缩其部件并将其发送回父级。4.父级将压缩部件按正确顺序连接到一个zip文件中并保存。5.结果是在父主机上创建了一个zip存档。您是对的,也许我没有足够清楚地描述这个问题。想法如下:1。父主机正在读取要压缩的文件并将其拆分为多个部分。2.使用jpvm父级将同样大的部分发送到多个主机。3.每个主机并行压缩其部件并将其发送回父级。4.父级将压缩部件按正确顺序连接到一个zip文件中并保存。5.结果是父主机上有一个zip存档。