gpt4 book ai didi

java - MappedByteBuffer 初始运行缓慢

转载 作者:行者123 更新时间:2023-12-01 13:12:14 29 4
gpt4 key购买 nike

长期读者,第一次发帖。

我在从一组二进制文件快速读取数据时遇到了一些问题。 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 秒才能运行,但如果我再次运行它,它会在 10 毫秒内完成。似乎它需要进行某种初始运行才能设置正确的行为。我发现通过做这样简单的事情是有效的:

channel = new RandomAccessFile(new File(mdfFile), "r").getChannel();
ByteBuffer buf = ByteBuffer.allocateDirect(DATASIZE);
channel.read(buf);
channel.close();

这大约需要 2 秒,如果我随后运行 MappedByteBuffer 过程,它将在 10 毫秒内返回数据。我只是不知道如何摆脱初始化步骤并在第一次 10 毫秒内读取数据。我读过各种有关“热身”、JIT 和 JVM 的文章,但都无济于事。

所以,我的问题是,是否可以立即获得 10 毫秒的性能,或者我是否需要进行某种初始化?如果是这样,最快的方法是什么?

该代码旨在运行大约一千个相当大的文件,因此速度非常重要。

非常感谢。

最佳答案

I just cannot figure out how to get rid of that initialisation step and read the data in 10ms first time

你不能。数据确实必须从磁盘读取。这需要超过 10ms 的时间。 10ms 是针对已经在内存中的所有其他时间。

关于java - MappedByteBuffer 初始运行缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22757612/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com