读取大二进制文件后退使用pread

时间:2018-02-08 03:39:51

标签: c++ linux file

我正在寻找从文件末尾读取非常大的二进制文件(+ 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。

非常感谢任何有助于改进反向阅读的建议。

0 个答案:

没有答案