0

我正在使用两种压缩算法的连续应用在 Java 中压缩超过 2GB 的文件;一个基于 LZ,一个基于 Huffman。(这类似于 DEFLATE)。

由于 2GB 太大而无法保存在任何缓冲区中,因此我必须通过输出临时文件的一种算法传递文件,然后通过输出最终文件的第二种算法传递该临时文件。

另一种方法是将文件压缩为 8MB 块(我没有收到 Out-Of-Memory 错误的大小),但是我无法充分利用整个文件中的冗余。

任何想法如何更整洁地执行这些操作。没有临时文件,也没有块压缩?是否有任何其他压缩工具以块为单位进行压缩?他们如何处理这个问题?问候

4

3 回答 3

1
于 2014-02-07T07:17:37.890 回答
0

您可以使用两个级别的java.util.zip. 首先,只需连接所有文件(不压缩)。如果可能,请按文件类型对条目进行排序,以便相似的文件彼此相邻(这将提高压缩率)。其次,压缩这个流。您不需要运行两个单独的阶段;相反,您可以将第一个阶段包含在第二阶段中,例如CompressStream(ConcatenateFiles(directory)). 这样一来,您在另一个 zip 文件中就有了一个 zip 文件:外部 zip 文件被压缩,内部不是并且包含所有实际文件。

确实,java.util.zip曾经遇到大于 2 GB 的文件的问题(我确实遇到了这些问题)。但是,我相信这只是 .ZipFile而不是ZipIn/OutputStream. 另外,我认为这些问题在最近的 Java 版本中得到了解决。

缓冲区大小:常规压缩算法(例如 Deflate)不会受益于大于约 64 KB 的块大小。更高级的算法可以受益于使用更大的块大小,例如高达 900 KB 的 bzip2高达 2 MB 的 LZMA2。除此之外的任何事情都更有可能是重复数据删除领域,这对于您想要做的事情可能有意义也可能没有意义。

于 2014-02-08T09:09:06.623 回答
0

流的管道有什么问题?您可以读取InputStream、压缩字节并将它们写入连接到下一个算法的输入流的输出流。看看PipeInputStreamPipeOutputStream

我希望这些算法可以增量工作。

于 2014-02-06T17:40:23.390 回答