以下问题:

我有一个tarGz存档,其中充满了大约1 000 000个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);
        }
    }

最佳答案

我不认为您的问题出在TarArchiveInputStream上,而是在FileOutputStream上是完全没有缓冲的,您应该使用BufferedOutputStream包装它。

另外,IOUtils.copyLarge方法允许您指定缓冲区大小。根据文件大小,您可能会从读取更大的块中获益。

10-04 13:05