У меня есть большой (3Gb) двоичный файл двойников, к которому я обращаюсь (более или менее) случайным образом во время итеративного алгоритма, который я написал для кластеризации данных. Каждая итерация делает около полумиллиона чтений из файла и около 100 тысяч записей новых значений.
Я создаю FileChannel следующим образом...
f = new File(_filename);
_ioFile = new RandomAccessFile(f, "rw");
_ioFile.setLength(_extent * BLOCK_SIZE);
_ioChannel = _ioFile.getChannel();
Затем я использую частный 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, которое я могу сделать для ускорения чтения? Я понимаю, что могу поменять аппаратное обеспечение, но прежде чем я это сделаю, я хочу убедиться, что выжал из проблемы все до последней капли программного сока.
заранее спасибо