以下问题:
我有一个tarGz存档,其中充满了约1000000个protoBuffer文件,我必须对其进行解压缩和处理。 目前,我发现的斋戒方法是用apache.commons的TarArchiveInputStream解开它的焦油。 目前,解压缩的部分是我的瓶颈,因为解压缩大约需要20分钟。
这可以更快吗? 是他们解压缩具有多个线程的targz文件的一种方法,我完全不知道这样做是否可行?
感谢您的帮助。
我的解压缩功能:
public void untar(String tarPath) throws IOException {
try(TarArchiveInputStream fin = new TarArchiveInputStream(new GzipCompressorInputStream(new FileInputStream(tarPath)))){
UnzipperThreadHandler.setFinished(false);
TarArchiveEntry entry;
File out = new File((new File(tarPath).getParent())+"/help");
while ((entry = fin.getNextTarEntry()) != null) {
if (entry.isDirectory()) {
continue;
}
File curfile = new File(out, entry.getName());
File parent = curfile.getParentFile();
if (!parent.exists()) {
parent.mkdirs();
}
FileOutputStream fos = new FileOutputStream(curfile);
IOUtils.copy(fin, fos);
fos.close();
}
UnzipperThreadHandler.setFinished(true);
}
}
答案 0 :(得分:0)
我不认为您的问题出在TarArchiveInputStream上,而在于FileOutputStream完全没有缓冲。您应该用BufferedOutputStream包裹它。
此外,IOUtils.copyLarge方法还允许您指定缓冲区大小。根据文件大小,您可能会从读取较大的块中获利。