Io uso Java 1.5 su un dispositivo Linux incorporato e voglio leggere un file binario con 2 MB di valori int. (Ora 4bytes Big Endian, ma posso decidere, il formato)Il modo più veloce per leggere un numero enorme di int dal file binario
Utilizzando DataInputStream
via BufferedInputStream
utilizzando dis.readInt()
), questi 500 000 chiamate bisogno 17S da leggere, ma il file letto in un buffer grande byte ha bisogno di 5 secondi.
Come posso leggere quel file più velocemente in un unico enorme []?
Il processo di lettura non deve utilizzare più di 512 kb in aggiunta.
Questo codice di seguito che utilizza nio
non è più veloce dell'approccio readInt() da 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();
Aggiornamento: La valutazione delle risposte:
Su PC la mappa di memoria con l'approccio IntBuffer stato il più veloce nel mio set up.
Sul dispositivo embedded, senza JIT, il java.io DataiInputStream.readInt() è stato un po 'più veloce (17s, 20s vs per la memmap con IntBuffer)
Conclusione finale: velocità significativa up è più facile da raggiungere via Cambiamento algoritmico (File in formato più piccolo per init)
Si prega di controllare anche http://makeprogrammingyourforte.blogspot.in/2012/09/fastest-way-to-read-input-in-java.html – Algorithmist
@Algorithmist Ho controllato il tuo link, ma si legge da un testo presentare – AlexWien
Berkeley ha una massa di estensione IO JNI disponibile [qui] (http://www.cs.berkeley.edu/~bonachea/java/). Non l'ho usato, ma potrebbe essere utile dare un'occhiata. –