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)