我在嵌入式 Linux 设备上使用 Java 1.5,并希望读取一个具有 2MB int 值的二进制文件。(现在是 4bytes Big Endian,但我可以决定,格式)
使用DataInputStream
via BufferedInputStream
using dis.readInt()
),这 500 000 次调用需要 17 秒才能读取,但文件读入一个大字节缓冲区需要 5 秒。
我怎样才能将该文件更快地读入一个巨大的 int[]?
阅读过程不应额外使用超过 512 kb。
下面使用的这段代码nio
并不比 java io 中的 readInt() 方法快。
// 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();
更新:对答案的评估:
在 PC 上,使用 IntBuffer 方法的内存映射是我设置中最快的。
在没有 jit 的嵌入式设备上,java.io DataiInputStream.readInt() 更快一些(17 秒,而带有 IntBuffer 的 MemMap 则为 20 秒)
最终结论:通过算法更改更容易实现显着加速。(初始化文件较小)