【问题标题】:How can I control file compression parameters in Java to decompress objects faster?如何在 Java 中控制文件压缩参数以更快地解压缩对象?
【发布时间】:2026-02-04 15:00:01
【问题描述】:

我正在将我创建的一些大型 Java 对象写入文件,然后将其读回。我正在使用压缩,因为该对象非常大,并且我有大约 600 个不同的实例(每个实例都在一个单独的文件中)。我目前正在使用 bzip2 和 Apache 的 org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream:

import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream;
import org.apache.commons.lang3.SerializationUtils;

InputStream in = new BZip2CompressorInputStream(new FileInputStream("myfile.bz2"));
Document doc = (Document) SerializationUtils.deserialize(in);

问题是当前解压需要很长时间(超过 10 秒),因此读取所有 600 个对象大约需要两个小时。我想要么使用更快的压缩类,要么控制当前类的参数,以便解压更快(我最担心解压时间,因为它会发生很多次,慢速压缩是可以忍受的)。为了解压速度,我也愿意付出更大的压缩文件的代价。

当使用不同的软件进行压缩时,您通常可以选择“压缩级别”,例如“Fastest”、“Fast”、“Normal”、“Best”等值。有时您甚至可以获得更多参数,例如“压缩方法”、“字典大小”、“字大小”等。

有谁知道如何通过代码控制这些参数,有哪些推荐值?还是只知道快速解压类?

【问题讨论】:

  • 解压时的瓶颈是什么?可能是其他类似无缓冲输入的东西。
  • 速度也取决于所需数据结构的大小。它越大,签入的速度越慢,并且对于大多数类型的数据而言优势正在减弱。
  • 只是为了好玩,尝试将所有文​​件都_un_compressed文件做一些实验,看看速度如何。

标签: java performance zip compression bzip2


【解决方案1】:

BZip2 获得了非常好的压缩比,但代价是相当缓慢。在频谱的另一端是类似snappy 的东西,它非常快,但压缩比没有那么好。 GZip 在中间。

Here 是 java 中一些压缩基准的列表。

【讨论】: