Schnellster Weg, um eine große Anzahl von Int aus einer Binärdatei zu lesen

Ich verwende Java 1.5 auf einem eingebetteten Linux-Gerät und möchte eine Binärdatei mit 2 MB int-Werten lesen. (jetzt 4Byte Big Endian, aber ich kann das Format selbst bestimmen)

VerwendenDataInputStream überBufferedInputStream mitdis.readInt()), diese 500 000 Aufrufe benötigen 17s zum Lesen, aber die Datei, die in einen großen Byte-Puffer eingelesen wird, benötigt 5 Sekunden.

Wie kann ich diese Datei schneller in ein großes int [] einlesen?

Der Lesevorgang sollte nicht mehr als zusätzlich 512 kb beanspruchen.

Dieser Code unten mitnio ist nicht schneller als der readInt () - Ansatz von 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();

Update: Auswertung der Antworten:

Auf dem PC war die Memory Map mit IntBuffer-Ansatz die schnellste in meinem Setup.
Auf dem eingebetteten Gerät war java.io DataiInputStream.readInt () ohne JIT etwas schneller (17s gegenüber 20s für die MemMap mit IntBuffer)

Abschließende Schlussfolgerung: Eine signifikante Beschleunigung ist durch algorithmische Änderungen einfacher zu erreichen. (Kleinere Datei für init)

Antworten auf die Frage(3)

Ihre Antwort auf die Frage