Najszybszy sposób na odczyt ogromnej liczby int z pliku binarnego
Używam Java 1.5 na wbudowanym urządzeniu Linux i chcę odczytać plik binarny z 2 MB wartości int. (teraz 4 bajty Big Endian, ale mogę zdecydować, format)
Za pomocąDataInputStream
przezBufferedInputStream
za pomocądis.readInt()
), te 500 000 wywołań wymaga 17 sekund do odczytania, ale plik odczytany w jednym dużym buforze bajtowym potrzebuje 5 sekund.
Jak mogę szybciej odczytać ten plik w jednym ogromnym int []?
Proces odczytu nie powinien wykorzystywać więcej niż dodatkowo 512 kb.
Poniższy kod używanio
nie jest szybszy niż podejście readInt () z 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();
Aktualizacja: Ocena odpowiedzi:
Na PC mapa pamięci z podejściem IntBuffer była najszybsza w mojej konfiguracji.
Na urządzeniu wbudowanym, bez jit, java.io DataiInputStream.readInt () był nieco szybszy (17s, vs 20s dla MemMap z IntBuffer)
Wniosek końcowy: Znaczne przyspieszenie jest łatwiejsze do osiągnięcia dzięki zmianie algorytmicznej. (Mniejszy plik dla init)