0

.tar.gz ファイルの内容を 2 つのフォルダーにコピーしたいのですが、約 20 個のファイルがあり、解凍した合計サイズは 20 GB を超えます。
これには Truezip を使用しました。

 TFile archive = new TFile(absoluteZipName); // archive with .tar.gz
    TFile[] archFiles = archive.listFiles(); // takes too much time 
    for (TFile t : archFiles) {
         String fileName = t.getName();
          if(fileName.endsWith(".dat"))
              t.cp(new File(destination1+ t.getName()));
          else if(fileName.endsWith(".txt")){
               t.cp(new File(destination2+ t.getName()));
          }
    }
 It takes 3 times above tar xzf command (untar linux) . Have any way to optimize this code for fast copying, memory not an issue.  

    The following code allows fast copying Thanks npe for the good advice.
    (NB: I have no previledge to post the answe now that's why editing question itself)

InputStream is = new FileInputStream(absoluteZipName);
            ArchiveInputStream input = new ArchiveStreamFactory()
               .createArchiveInputStream(ArchiveStreamFactory.TAR, new GZIPInputStream(is));

            ArchiveEntry entry;
            while ((entry = input.getNextEntry()) != null) {
                OutputStream outputFileStream=null;
                if(entry.getName().endsWith(".dat")){
                 File outFile1= new File(destination1, entry.getName());
                     outputFileStream = new FileOutputStream(outFile1); 
                }
                else if(entry.getName().endsWith(".txt")){
                File outFile2= new File(destination2, entry.getName());
                     outputFileStream = new FileOutputStream(outFile2);   
                }
                // use ArchiveEntry#getName() to do the conditional stuff...
                IOUtils.copy(input, outputFileStream,10485760);
            }


    Is threading In file copy will reduce time..? In TZip didn't reduced as they already threading it. anyway I will try tomorrow and will let you Know.
4

3 に答える 3

0

あなたが目撃したパフォーマンスの問題の理由は、TARファイル形式に中央ディレクトリがないことです。ただし、TrueZIPは仮想ファイルシステムであり、クライアントアプリケーションのアクセスパターンを予測できないため、最初のアクセス時にTARファイル全体を一時ディレクトリに解凍する必要があります。これは、TFile.listFiles()で発生することです。次に、エントリを一時ディレクトリからターゲットディレクトリにコピーします。したがって、すべての各エントリバイトは4回読み取りまたは書き込みされます。

最高のパフォーマンスを得るには、次の2つのオプションがあります。

(a)ZIPファイル形式に切り替えて、TrueZIPファイル*APIを使用することができます。ZIPファイルには中央ディレクトリがあるため、ZIPファイルを読み取るために一時ファイルを作成する必要はありません。

(b)TAR.GZファイルをnpeで示されるようなストリームとして処理できます。次に、これをjava.util.zip.GZIPInputStreamと組み合わせます。これは、その実装が高速Cコードに基づいているためです。TrueZIPのStreams.copy(InputStream、OuputStream)メソッドも使用します。これは、マルチスレッドを使用して非常に高速な一括コピーを行うためです。

于 2012-06-12T02:15:26.423 に答える
0

ありがとう npe 、これは私が行った最終的なものです。とにかく、tar xzfよりも時間がかかりませんでした。このような最終的なコードスニペット。

InputStream is = new FileInputStream(absoluteZipName);
ArchiveInputStream input = new ArchiveStreamFactory()
   .createArchiveInputStream(ArchiveStreamFactory.TAR, new GZIPInputStream(is));

ArchiveEntry entry;
while ((entry = input.getNextEntry()) != null) {
    OutputStream outputFileStream=null;
    if(entry.getName().endsWith(".dat")){
     File outFile1= new File(destination1, entry.getName());
         outputFileStream = new FileOutputStream(outFile1); 
    }
    else if(entry.getName().endsWith(".txt")){
    File outFile2= new File(destination2, entry.getName());
         outputFileStream = new FileOutputStream(outFile2);   
    }
    // use ArchiveEntry#getName() to do the conditional stuff...
    IOUtils.copy(input, outputFileStream,10485760);
}

もう少し最適化できるといいのですが、後で行います。どうもありがとう

于 2012-06-12T03:38:16.230 に答える