データをクラスタリングするために作成した反復アルゴリズム中に (多かれ少なかれ) ランダムにアクセスする double の大きな (3Gb) バイナリ ファイルがあります。各反復では、ファイルから約 50 万回の読み取りと、新しい値の約 10 万回の書き込みが行われます。
このように FileChannel を作成します...
f = new File(_filename);
_ioFile = new RandomAccessFile(f, "rw");
_ioFile.setLength(_extent * BLOCK_SIZE);
_ioChannel = _ioFile.getChannel();
次に、double のサイズのプライベート ByteBuffer を使用して、そこから読み取ります
private ByteBuffer _double_bb = ByteBuffer.allocate(8);
私の読み取りコードは次のようになります
public double GetValue(long lRow, long lCol)
{
long idx = TriangularMatrix.CalcIndex(lRow, lCol);
long position = idx * BLOCK_SIZE;
double d = 0;
try
{
_double_bb.position(0);
_ioChannel.read(_double_bb, position);
d = _double_bb.getDouble(0);
}
...snip...
return d;
}
そして私はそれにこのように書いています...
public void SetValue(long lRow, long lCol, double d)
{
long idx = TriangularMatrix.CalcIndex(lRow, lCol);
long offset = idx * BLOCK_SIZE;
try
{
_double_bb.putDouble(0, d);
_double_bb.position(0);
_ioChannel.write(_double_bb, offset);
}
...snip...
}
コードの繰り返しにかかる時間は、読み取り回数にほぼ比例して増加します。読み取り回数を最小限に抑えるために、周囲のコードに多くの最適化を追加しましたが、現時点では回避したいアルゴリズムの動作を根本的に変更することなく、必要と思われるコア セットにいます。
私の質問は、読み取り/書き込みコードまたは JVM 構成に、読み取りを高速化するためにできることがあるかどうかです。ハードウェアを変更できることはわかっていますが、その前に、問題からソフトウェア ジュースを最後の一滴まで絞り出したことを確認したいと考えています。
前もって感謝します