Самый быстрый способ прочитать огромное количество int из двоичного файла
Я использую Java 1.5 на встроенном устройстве Linux и хочу прочитать двоичный файл с 2 МБ значений int. (сейчас 4 байта Big Endian, но я могу решить, формат)
С помощьюDataInputStream
с помощьюBufferedInputStream
с помощьюdis.readInt()
), эти 500 000 вызовов требуют 17 секунд для чтения, но для чтения файла в один большой байтовый буфер требуется 5 секунд.
Как я могу прочитать этот файл быстрее в один огромный int []?
Процесс чтения не должен использовать более 512 КБ.
Этот код ниже, используяnio
не быстрее, чем метод readInt () из Java IO.
// asume I already know that there are now 500 000 int to read:
int numInts = 500000;
// here I want the result into
int[] result = new int[numInts];
int cnt = 0;
RandomAccessFile aFile = new RandomAccessFile("filename", "r");
FileChannel inChannel = aFile.getChannel();
ByteBuffer buf = ByteBuffer.allocate(512 * 1024);
int bytesRead = inChannel.read(buf); //read into buffer.
while (bytesRead != -1) {
buf.flip(); //make buffer ready for get()
while(buf.hasRemaining() && cnt < numInts){
// probably slow here since called 500 000 times
result[cnt] = buf.getInt();
cnt++;
}
buf.clear(); //make buffer ready for writing
bytesRead = inChannel.read(buf);
}
aFile.close();
inChannel.close();
Обновление: оценка ответов:
На ПК карта памяти с подходом IntBuffer была самой быстрой в моей установке.
На встроенном устройстве без jit функция java.io DataiInputStream.readInt () была немного быстрее (17 с против 20 с для MemMap с IntBuffer)
Заключительный вывод. Значительного ускорения легче достичь с помощью алгоритмических изменений. (Меньший файл для init)