2012-03-01 6 views
1

以下の2つのプログラムでは、パフォーマンスに大きな違いが見られます。BufferReader.skip()performance

import java.io.*; 
import java.util.Date; 

class SkipProg2 { 

    public static void main (String args[]) { 

     System.out.println (" File Reading "+ args.length); 
     System.out.println (" 1st Arg "+ args[0]); 
     System.out.println (" 2nd Arg "+ args[1]); 
     try { 
      FileInputStream fis = new FileInputStream(args[0]); 

      System.err.println("Time before skip : " + new Date()); 

      Long off = Long.parseLong(args[1]); 

      fis.skip (off); 
      System.err.println("Time After skip : " + new Date()); 


      InputStreamReader isr = new InputStreamReader(fis); 
      BufferedReader br = new BufferedReader(isr); 

      } // end try 
      catch (IOException e) { 
      System.err.println("Error: " + e); 
     } 
    } // end main 

} 

そして

import java.io.*; 
import java.util.Date; 

class SkipProg { 

    public static void main (String args[]) { 

     System.out.println (" File Reading "+ args.length); 
     System.out.println (" 1st Arg "+ args[0]); 
     System.out.println (" 2nd Arg "+ args[1]); 
     try { 
      FileInputStream fis = new FileInputStream(args[0]); 

      InputStreamReader isr = new InputStreamReader(fis); 
      BufferedReader br = new BufferedReader(isr); 

      System.err.println("Time before skip : " + new Date()); 
      Long off = Long.parseLong(args[1]); 

      br.skip (off); 
      System.err.println("Time After skip : " + new Date()); 
      } // end try 
      catch (IOException e) { 
      System.err.println("Error: " + e); 
     } 
    } // end main 

} 

一つの用法FileInputStream.skip()と別のBufferReader.skip()。しかし、オフセット値が大きい場合(2GBで異なる例8の場合)とマルチスレッドアプリケーションでは、同じコードの違いが大きくなります(2Gbのオフセットには約15-20分の遅延があります)。 BufferReader.skip()をFileInputStream.skip()に置き換えることはできません。バイト単位でオフセットを取り、char型で別のものを取ります。ユニコードファイルの場合は、置き換えられません。

私の前提が正しいかどうか最初の質問?何が示唆ですか?

ありがとうございました。

+0

はその8 2ギガバイトのための秒、および15ですあなたが同じことをしているスレッドがたくさんある場合は-20分ですか?あなたが古いメディアを回転させていると仮定すると、複数のファイルを一度に読むことは、場所のいたる所にヘッドシークを引き起こします。 –

答えて

1

skip for bytesは、スキップして多くのバイトを読み飛ばすことができます。

文字のスキップは、そのポイントまでのすべての文字/バイトを読み取って、N番目の文字がどこにあるかを調べる必要があります。

2GBのテキストを読むには15-20分かかります。私は20秒に近いと思っていただろう。あなたはどんな種類のハードウェアを持っていますか?

テキストファイル内のランダムアクセスが必要な場合、あなたはバイトの場所に行番号のインデックスを維持する必要があります(時間が取られている方法は同じに賭ける)