我在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;
}
答案 0 :(得分:2)
我不知道默认情况下应用了多少缓冲(如果有的话) - 但您可能想尝试在BufferedInputStream
/ BufferedOutputStream
中包装输入和输出。您也可以尝试增加缓冲区大小 - 1K是一个非常小的缓冲区。尝试不同的尺寸,例如16K,64K等。当然,这些应该使用BufferedInputStream
而不是那么重要。
另一方面,我怀疑这不是问题所在。如果它有时在10分钟内结束,有时需要数小时,这表明发生了一些非常奇怪的事情。如果需要很长时间,它真的在取得进展吗?输出文件的大小是否增加?它使用了重要的CPU吗?磁盘是否一直在使用?
一方面注意:当您在finally块中关闭in
和out
时,您也不需要在try
块中关闭它。
答案 1 :(得分:0)
如果你有8演出的RAM,并且输入文件是2演出,你可以尝试使用内存映射文件。 Here就是如何做到的一个例子。
答案 2 :(得分:0)
尝试使用java.nio中的通道,有一种方法将字节从一个文件通道传输到另一个文件通道。然后你不必自己复制它们。这可能会非常优化。请参见FileInputStream.getChannel()