2011-07-06 22 views
0

JVM RAMのみを使用してJavaで外部ソートのアルゴリズムを記述する必要があります(基本的にはファイルをマップできません)。だから私がやりたい最初の部分は、ファイルからチャンク内のデータを読み込むことです。外部ソートの最適化

this tutorialが見つかりました。

問題はチュートリアルがbyteを読むことであり、私はintを読む必要があります。私はどのようにIntBufferが実装されているか分かりませんが、私はそれがバイトバッファの周りのラッパーだと思います。その事実を考えれば、私ができる最速のことはチュートリアル(下のコード)の "FileChannel直接ByteBufferとバイト配列"メソッドを使用して、私は "手動で" intと別の配列を作成するだけです。ビット操作を使用してバイトから取得する?

FileInputStream f = new FileInputStream(name); 
FileChannel ch = f.getChannel(); 
ByteBuffer bb = ByteBuffer.allocateDirect(BIGSIZE); 
byte[] barray = new byte[SIZE]; 
long checkSum = 0L; 
int nRead, nGet; 
while ((nRead=ch.read(bb)) != -1) 
{ 
    if (nRead == 0) 
     continue; 
    bb.position(0); 
    bb.limit(nRead); 
    while(bb.hasRemaining()) 
    { 
     nGet = Math.min(bb.remaining(), SIZE); 
     bb.get(barray, 0, nGet); 
     for (int i=0; i<nGet; i++) 
      checkSum += barray[i]; 
    } 
    bb.clear(); 
} 

また、私は小さな追加の質問があります:私は完全に異なるアプローチを使用する必要があり、私は並行して読んでソートしたい(I/Oは、廃棄物に多くの時間を)、または1つに、このメソッドを使用していますスレッドと他のスレッドの良いアプローチでソート?私は実際にパフォーマンスのナノ秒ごとに戦いたいと思っています。

+6

私はあなたが最初に動作するものを書くべきだと思って、パフォーマンスのナノセカンドで*戦いを戦う。あなたがそれを測定できないときに、より速いものをどのように予測できるでしょうか? –

+1

"JVM RAM"とは何ですか? –

答えて

1
new DataInputStream(new BufferedInputStream(new FileInputStream(file))); 

です。次に、readInt()を使用します。これはマップされたファイルが不足しているFileChannelsでできることと同じくらい速く、通常のI/Oより約20%だけ高速です。

ダイレクトバイトバッファーはここでは役に立ちません。彼らは自分でデータを見たり変更したりするのではなく、チャンネル間でコピーするだけの場合に最も便利です。データがJNI/Java境界を2回越えて保存され、JNI層の内部に保持されます。この場合は適用されません。

+0

こんにちは、お返事ありがとうございます! だから、非同期読書はどうですか?どのように実装されていますか?先読みしようとしていますか?先読みするスレッドを別に初期化すべきですか?また、デフォルトのバッファサイズは何ですか? ありがとうございました! – nivwusquorum

+1

1.7より前のJavaでは非同期読み取りはありません。ディスクコントローラとOSが何をしているのかは、キャッシュ、先読み、あらゆる種類のものがあります。 BufferedInputStreamのデフォルトのバッファサイズは8192です(指定されていませんが)。これが適切である必要があります。そうでない場合は、大きな要因で再生してみてください。 64kを試してください。 – EJP

1

あなたがパフォーマンスのナノ秒のために戦いたいなら、高速のディスクを購入してください。 SSDまたはRAID Nまたはその両方を使用します。 SSDドライブは、動くディスクよりも最大10倍高速にデータを転送できます。これはJavaでできることよりもはるかに大きな違いを生み出します。

関連する問題