Używam Java 1.5 na wbudowanym urządzeniu linuksowym i chcę odczytać plik binarny z 2 MB wartości int. (Obecnie 4bytes Big Endian, ale mogę zdecydować, format)Najszybszy sposób na odczytanie ogromnej ilości int z pliku binarnego
Korzystanie DataInputStream
poprzez BufferedInputStream
wykorzystaniem dis.readInt()
), te 500 000 połączeń potrzebuje 17s czytać, ale plik przeczytać w jeden duży bufor bajtowy potrzebuje 5 sekund.
Jak mogę szybciej odczytać ten plik w jednym wielkim int []?
Proces czytania nie powinien przekraczać 512 kb.
Ten kod poniżej przy użyciu nio
nie jest szybszy niż metoda 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 mapy pamięci z podejściem IntBuffer był najszybszy w moim skonfigurować.
na wbudowanym urządzeniu nie JIT java.io DataiInputStream.readInt() był nieco szybciej (17S, VS 20s do MemMap z IntBuffer)
Wnioski końcowe: Znaczne przyspieszenie jest łatwiej osiągnąć przez Zmiana algorytmu. (Mniejszy plik dla init)
Proszę również sprawdzić http://makeprogrammingyourforte.blogspot.in/2012/09/fastest-way-to-read-input-in-java.html – Algorithmist
@Algorithmist Sprawdziłem twój link, ale czyta z tekstu plik – AlexWien
Berkeley ma dostępne rozszerzenie JK JK luzem [tutaj] (http://www.cs.berkeley.edu/~bonachea/java/). Nie używałem tego, ale może to wyglądać dobrze. –