用Java解压缩巨大的gz文件和性能

时间:2011-02-14 10:46:03

标签: java gzip compression gz

我在java中解压缩一个巨大的gz文件,gz文件大约是2 GB,解压缩文件大约是6 GB。解压过程需要不时(小时),有时它会在合理的时间内完成(比如不到10分钟或更快)。
我有一个相当强大的盒子(8GB内存,4-cpu),有没有办法改进下面的代码?或使用完全不同的库?
我还使用Xms256m和Xmx4g到虚拟机。

public static File unzipGZ(File file, File outputDir) {
    GZIPInputStream in = null;
    OutputStream out = null;
    File target = null;
    try {
        // Open the compressed file
        in = new GZIPInputStream(new FileInputStream(file));

        // Open the output file
        target = new File(outputDir, FileUtil.stripFileExt(file.getName()));
        out = new FileOutputStream(target);

        // Transfer bytes from the compressed file to the output file
        byte[] buf = new byte[1024];
        int len;
        while ((len = in.read(buf)) > 0) {
            out.write(buf, 0, len);
        }

        // Close the file and stream
        in.close();
        out.close();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (in != null) {
            try {
                in.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if (out != null) {
            try {
                out.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    return target;
}

3 个答案:

答案 0 :(得分:2)

我不知道默认情况下应用了多少缓冲(如果有的话) - 但您可能想尝试在BufferedInputStream / BufferedOutputStream中包装输入和输出。您也可以尝试增加缓冲区大小 - 1K是一个非常小的缓冲区。尝试不同的尺寸,例如16K,64K等。当然,这些应该使用BufferedInputStream而不是那么重要。

另一方面,我怀疑这不是问题所在。如果它有时在10分钟内结束,有时需要数小时,这表明发生了一些非常奇怪的事情。如果需要很长时间,它真的在取得进展吗?输出文件的大小是否增加?它使用了重要的CPU吗?磁盘是否一直在使用?

一方面注意:当您在finally块中关闭inout时,您也不需要在try块中关闭它。

答案 1 :(得分:0)

如果你有8演出的RAM,并且输入文件是2演出,你可以尝试使用内存映射文件。 Here就是如何做到的一个例子。

答案 2 :(得分:0)

尝试使用java.nio中的通道,有一种方法将字节从一个文件通道传输到另一个文件通道。然后你不必自己复制它们。这可能会非常优化。请参见FileInputStream.getChannel()