我正在尝试用 Java 解压缩大约 8000 个 gzip 格式的文件。我的第一次尝试是使用 GZIPInputStream 但性能很糟糕。
任何人都知道解压缩 gzip 档案的任何替代方法吗?我尝试了 ZipInputStream,但它无法识别 gzip 格式。
先感谢您。
您需要使用缓冲。写入小块数据将是低效的。压缩实现在 Sun JDK 中的本机代码中。即使不是缓冲性能,通常也应该超过合理的文件或网络 I/O。
OutputStream out = new BufferedOutputStream(new GZIPOutputStream(rawOut));
InputStream in = new BufferedInputStream(new GZIPInputStream(rawIn));
由于本机代码用于实现解压缩/压缩算法,因此在使用后关闭流(而不仅仅是底层流)要非常小心。我发现有大量的“Deflaters”对性能非常不利。
ZipInputStream
处理文件的存档,这与压缩流完全不同。
当你说它GZipInputStream
的表现很糟糕时,你能更具体一点吗?您是否发现它是 CPU 瓶颈还是 I/O 瓶颈?您是否在输入和输出上都使用缓冲?如果您可以发布您正在使用的代码,那将非常有帮助。
如果您在多核机器上,您可以尝试仍然使用GZipInputStream
但使用多个线程,每个核心一个,还有一个共享的文件队列仍有待处理。(任何一个文件都只能由一个线程处理。)如果您受 I/O 限制,这可能会使事情变得更糟,但它可能值得一试。
对于这种规模,假设您的平台要求有限,您可能希望采用原生方式。您可以使用 JNI 调用库或使用ProcessBuilder
.