Zdravím a mám dotaz na zkušenější Javisty:
Načítám číselná data ze souboru (~ stovky MB) do pole v paměti. Data mohou být různého formátu (int8, uint16, float32, ... atd) a proto volám v cyklu DataInputStream.readWhatever(), podle toho co je zrovna potřeba, např. takto:
DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream(file)));
float[] pole = new float[size];
for (int i = 0; i < size; i++)
pole[i] = dis.readFloat();
Všechno funguje, až na to, že
první volání tohoto kódu po spuštění aplikace je asi 3x pomalejší než všechna
následná volání. Nezáleží na tom, jestli čtu ten samý soubor znovu nebo úplně jiný. Chová se to stejně i když ten soubor načtu do byte[] a použiju ByteArrayInputStream. Paměti je k dispozici řádově víc než velikost pole.
Pokud v tomto konkrétním případě použiju
byte[] buf = new byte[size * 4];
dis.read(buf);
ByteBuffer.wrap(buf).asFloatBuffer.getFloats(pole);
tak je to rychlostně OK, takže by to nemělo souviset s disk IO nebo alokací paměti, či co...