У меня есть большой (3Gb) двоичный файл двойников, к которому я обращаюсь (более или менее) случайным образом во время итеративного алгоритма, который я написал для кластеризации данных. Каждая итерация выполняет около полумиллиона операций чтения из файла и около 100 000 записей новых значений.
Я создаю 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, которое я могу сделать, чтобы ускорить чтение? Я понимаю, что могу сменить аппаратное обеспечение, но прежде чем сделать это, я хочу убедиться, что я выжал все до последней капли программного сока из проблемы.
Заранее спасибо