【问题标题】:Decompress a Gzip archive in Java在 Java 中解压缩 Gzip 存档
【发布时间】:2010-10-12 12:02:56
【问题描述】:

我正在尝试用 Java 解压缩大约 8000 个 gzip 格式的文件。我的第一次尝试是使用 GZIPInputStream,但性能很差。

有人知道解压缩 gzip 档案的任何替代方法吗?我试过 ZipInputStream 但它无法识别 gzip 格式。

提前谢谢你。

【问题讨论】:

  • 你是在解压要被java应用处理的文件还是写到磁盘上?
  • 由java应用处理。它们都将被编入索引。
  • 对于相同操作,您的性能与 CLI/gzip 性能相比如何?
  • 测试 JUST 读取和解压缩文件的速度(并将结果数据丢弃)也可能很有趣。如果您的问题是写出文件,您可能需要进一步缓冲和线程化。

标签: java gzip archive


【解决方案1】:

您需要使用缓冲。写入小块数据将是低效的。压缩实现在 Sun JDK 中的本机代码中。即使不是缓冲性能,通常也应该超过合理的文件或网络 I/O。

OutputStream out = new BufferedOutputStream(new GZIPOutputStream(rawOut));

InputStream in = new BufferedInputStream(new GZIPInputStream(rawIn));

由于本机代码用于实现解压/压缩算法,因此在使用后关闭流(而不仅仅是底层流)要非常小心。我发现有大量的 `Deflater' 在周围闲逛对性能非常不利。

ZipInputStream 处理文件的存档,这与压缩流完全不同。

【讨论】:

  • 因为它使用原生代码,所以一定要关闭 gzip 流。
【解决方案2】:

当你说GZipInputStream 的表现很糟糕时,你能更具体一点吗?您是否发现它是 CPU 瓶颈还是 I/O 瓶颈?您是否在输入和输出上都使用缓冲?如果您可以发布您正在使用的代码,那将非常有帮助。

如果您使用的是多核机器,您仍可以尝试使用GZipInputStream,但使用多个线程,每个内核一个,并且共享文件队列仍需处理。 (任何一个文件都只能由一个线程处理。)如果您受 I/O 限制,那可能会使事情变得更糟,但它可能值得一试。

【讨论】:

    【解决方案3】:

    对于这种规模,假设您的平台要求有限,您可能希望采用原生方式。您可以使用 JNI 调用库或使用 ProcessBuilder 调用本机命令。

    【讨论】:

    • 有趣。这意味着解压缩步骤不是问题或无法改进。
    猜你喜欢
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多