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)

questionAnswers(3)

yourAnswerToTheQuestion