长期读者,第一次海报。
我在从一组二进制文件中快速读取数据时遇到了一些麻烦。 ByteBuffers和MappedBytBuffers提供了我需要的性能,但它们似乎需要初始运行来预热。我不确定这是否合理,所以这里有一些代码:
int BUFFERSIZE = 864;
int DATASIZE = 33663168;
int pos = 0;
// Open File channel to get data
FileChannel channel = new RandomAccessFile(new File(myFile), "r").getChannel();
// Set MappedByteBuffer to read DATASIZE bytes from channel
MappedByteBuffer mbb = channel.map(FileChannel.MapMode.READ_ONLY, pos, DATASIZE);
// Set Endianness
mbb.order(ByteOrder.nativeOrder());
ArrayList<Double> ndt = new ArrayList<Double>();
// Read doubles from MappedByteBuffer, perform conversion and add to arraylist
while (pos < DATASIZE) {
xf = mbb.getDouble(pos);
ndt.add(xf * cnst * 1000d + stt);
pos += BUFFERSIZE;
}
// Return arraylist
return ndt;
所以这需要大约7秒的时间才能运行,但是如果我再次运行它会在10ms内完成。它似乎需要进行某种初始运行来设置正确的行为。我发现通过做这样简单的事情可以起作用:
channel = new RandomAccessFile(new File(mdfFile), "r").getChannel();
ByteBuffer buf = ByteBuffer.allocateDirect(DATASIZE);
channel.read(buf);
channel.close();
这需要大约2秒钟,如果我然后运行MappedByteBuffer过程,它将在10ms内返回数据。我无法弄清楚如何摆脱初始化步骤并在第一次读取数据10ms。我已经阅读了各种有关“预热”,JIT和JVM的内容,但都无济于事。
所以,我的问题是,是否可以立即获得10 ms的性能,还是需要进行某种初始化?如果是这样,请问最快的方法是什么?
该代码旨在运行大约一千个非常大的文件,因此速度非常重要。
非常感谢。
答案 0 :(得分:1)
我无法弄清楚如何摆脱初始化步骤并在10ms内首次读取数据
你做不到。必须从磁盘读取数据。这需要超过10毫秒。当它已经在内存中时,10ms是所有其他时间。