Оптимизация внешней сортировки - PullRequest
0 голосов
/ 06 июля 2011

Я должен написать алгоритм для внешней сортировки в 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( );
}

Кроме того, у меня есть небольшой дополнительный вопрос: я хочу читать и сортировать параллельно (ввод-вывод тратит много времени), должен ли я использоватьсовершенно другой подход, или использование этого метода в одном потоке и сортировка в другом потоке - хороший подход?Я действительно хочу бороться за каждую наносекунду производительности.

Ответы [ 2 ]

1 голос
/ 06 июля 2011

Если вы хотите бороться за вечную наносекунду производительности, покупайте более быстрые диски, например, используя SSD или RAID N или оба.Дисковод SSD может передавать данные в 10 раз быстрее, чем движущийся диск.Это будет иметь гораздо большее значение, чем все, что вы можете сделать в Java.

1 голос
/ 06 июля 2011
new DataInputStream(new BufferedInputStream(new FileInputStream(file)));

и затем используйте readInt ().Это будет так же быстро, как все, что вы можете сделать с FileChannels, за исключением сопоставленного файла, и они только примерно на 20% быстрее, чем обычный ввод / вывод.

Прямые байтовые буферы здесь вам тоже не помогут.Они наиболее полезны, когда вы не хотите просматривать или изменять данные самостоятельно, а просто копируете между каналами.Он сохраняет данные от пересечения границы JNI / Java дважды, просто хранит их внутри уровня JNI.Не относится к этому делу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...