gpt4 book ai didi

java - RandomAccessFile 第一次访问时速度很慢

转载 作者:行者123 更新时间:2023-12-02 12:23:42 25 4
gpt4 key购买 nike

我目前正在使用 RandomAccessFile 并遇到一个奇怪的现象。我正在访问一个 1.1TB 大的文件,并且仅包含等于 00000000 的字节。

我通过以下方式实现了 RandomAccessFile:

RandomAccessFile raf = new RandomAccessFile(new File("./db.bin"),"rw");

所以我的程序正在生成一个代表 BIT 位置的长整型值的大列表,一旦达到 1000 个条目,它会将数据刷新到文件中:

    public void flush() {
for( long l : lLongs ) {
lseek = Long.divideUnsigned(l, 8L);
raf.seek( lseek );
byte b = raf.readByte();
raf.seek( lseek );
raf.writeByte( editByte(b,(int)l % 8) );
}
raf.close();
}

public byte editByte( byte b, int iBit ) {
if( !isSet(b,iBit) ) {
b = (byte)(b + Math.pow( 2, iBit));
}
return b;
}

boolean isSet(byte value, int bit){
return (value >> bit & 1) == 1;
}

现在我想知道为什么需要这么长时间?对于 1000 个条目,平均需要 15 秒。但如果我取消我的程序并重新启动它,我只需要 5 毫秒即可完成 1000 个条目(多头头寸保持不变)

这是为什么呢?有人可以帮我解决这个问题吗?

最佳答案

逻辑上的解释是,第一次启动需要实际读取文件,第二次启动从内存缓存中获取文件,所以速度要快得多。

还有第二次,如果我读对了,就不需要写数据了。

如果你想得到更好的东西,你可以尝试使用连续的东西,例如:

private static final int CHUNK_SIZE=512*8*1024;  // 4Mb chunk

private RandomAccessFile raf;
private long currentChunk=-1;
private byte[] chunk=new byte[CHUNK_SIZE];

public void flush() throws Exception{
raf = new RandomAccessFile(new File("./db.bin"),"rw");
List<Long> c=something();

c.stream().sorted().forEach(this::process);

saveChunk();
}

public void process(long l) {
try {
if (l/8/CHUNCK_SIZE!=currentChunk) {
saveChunk();
loadNextChunk();
}

long posInMem=(l/8) - (CHUNK_SIZE*currentChunk);
byte b=chunk[(int)posInMem];
chunk[(int)posInMem]=editByte(b,(int)l % 8);
}catch(Exception e) {
e.printStackTrace();
}
}

private void loadNextChunk()throws Exception {
currentChunk++;
raf.seek(currentChunk*CHUNK_SIZE);
raf.readFully(chunk, 0, CHUNK_SIZE);
}

private void saveChunk() throws Exception {
if (currentChunk<0)return;
raf.seek(currentChunk*CHUNK_SIZE);
raf.write(chunk, 0, CHUNK_SIZE);
}

关于java - RandomAccessFile 第一次访问时速度很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45583370/

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