我正在寻找从文件末尾读取非常大的二进制文件(+ 100GB)的最佳性能反向读取。目前,我已尝试测量 pread 的性能,以便读取10GB文件。测试是在SSD不旋转磁盘上。 SSD上的文件系统是exFAT。
如果向前读取文件(从低偏移到高偏移),性能很好。在我的测试中,我读了48k 10倍的经过时间~3ms。 如果从文件末尾读取文件并反向读取(从高偏移到低偏移),则经过的时间增加到33ms。
我尝试通过在每次读取后调用posix_fadvice(POSIX_FADV_DONTNEED)来清理缓存。我也尝试设置O_DIRECT | O_NOATIME | O_LARGEFILE | O_NONBLOCK。但这些方法对性能没有影响。
以下是我测试过的代码:
fd = open(filename, O_RDONLY | O_DIRECT | O_NOATIME | O_LARGEFILE | O_NONBLOCK);
for(long long int i=0x27ff7c000; i<0x280000000; i+=0xc000)
{
pread(fd, buffer, 0xc000, i);
posix_fadvise(fd, i, 0xc000, POSIX_FADV_DONTNEED);
}
//measure evey read ~ 3ms
for(long long int i=0x280000000; i>0x27ff7c000; i-=0xc000)
{
pread(fd, buffer, 0xc000, i);
posix_fadvise(fd, i, 0xc000, POSIX_FADV_DONTNEED);
}
//measure every read ~ 33ms
在进行正向读取时,我注意到第一次读取的经过时间 也更长。这是否意味着在使用大偏移量的pread时,将文件指针放置到相应的偏移量需要很长时间?然后文件指针从当前位置增加?但如果反向读取它需要从文件的开头重新计算文件指针,所以需要更长的时间?如果是这样的话,当反向读取100GB时会比这更糟糕 阅读10GB。
非常感谢任何有助于改进反向阅读的建议。