Я должен написать алгоритм для внешней сортировки в Java, используя только RAM JVM (в основном, я не могу отобразить файлы).Итак, первая часть, которую я хочу сделать, - это чтение данных из файла кусками.
Я нашел этот учебник .
Проблема в том, что учебник о чтенииbyte
с, и я должен прочитать int
с.Я не уверен, как реализовано IntBuffer
, но я думаю, что это обертка вокруг байтового буфера.Учитывая этот факт, я прав, что самое быстрое, что я могу сделать, это использовать метод FileChannel с прямым ByteBuffer и байтовым массивом из учебного руководства (код ниже), а затем просто создать отдельный массив с int
s, что я "«вручную получать из байтов с помощью битовых операций?»
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( );
}
Кроме того, у меня есть небольшой дополнительный вопрос: я хочу читать и сортировать параллельно (ввод-вывод тратит много времени), должен ли я использоватьсовершенно другой подход, или использование этого метода в одном потоке и сортировка в другом потоке - хороший подход?Я действительно хочу бороться за каждую наносекунду производительности.