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つに、このメソッドを使用していますスレッドと他のスレッドの良いアプローチでソート?私は実際にパフォーマンスのナノ秒ごとに戦いたいと思っています。
私はあなたが最初に動作するものを書くべきだと思って、パフォーマンスのナノセカンドで*戦いを戦う。あなたがそれを測定できないときに、より速いものをどのように予測できるでしょうか? –
"JVM RAM"とは何ですか? –