C++ 使用linux功能读取块的不连续运行

C++ 使用linux功能读取块的不连续运行,c++,c,linux-kernel,hard-drive,C++,C,Linux Kernel,Hard Drive,使用dbms风格的访问模式读取文件的最佳方法是什么;我的意思是: 我事先知道需要获取的页面偏移量 连续页面的运行时间较长 可能存在小的不连续性 可能存在长时间的不连续性 所有偏移都是有序的(没有前后移动) 此类抵销清单的示例: 1,2,3,4,5,6,7,8100011001003100410051010101101012310043100531006 我有点困惑,为了获得最佳性能,应该使用哪种策略 我应该依赖Linux页面管理器吗?怎样?将循环通过 一次偏移并读取一个块,好吗 用O_DI

使用dbms风格的访问模式读取文件的最佳方法是什么;我的意思是:

  • 我事先知道需要获取的页面偏移量
  • 连续页面的运行时间较长
  • 可能存在小的不连续性
  • 可能存在长时间的不连续性
  • 所有偏移都是有序的(没有前后移动)
此类抵销清单的示例: 1,2,3,4,5,6,7,8100011001003100410051010101101012310043100531006

我有点困惑,为了获得最佳性能,应该使用哪种策略

  • 我应该依赖Linux页面管理器吗?怎样?将循环通过 一次偏移并读取一个块,好吗
  • 用O_DIRECT打开文件并管理我自己,即:交替长时间阅读和查找。在这种情况下,我应该禁用readahead吗

我不知道它是否最终是“最好的”,但我可能会
mmap()
文件,然后使用
madvise()
尝试强制系统进入故障前页面范围。显然,这还需要对偏移量列表进行一点计算,以识别连续的范围(好吧,实际上并不需要它,但这将减少
madvise()
调用,并且如果有很多这样的范围,将获得一点效率)。到故障前的距离有多远取决于您在每个页面/范围上花费多少时间进行您试图进行的任何计算,因此需要进行一些测试/调整。您还可以使用
madvise()
来提示您在使用完范围后不再需要它,因此,它可能会跳到下一个待释放列表的前面。

O_DIRECT
可能很难使用,因为您必须自己管理对齐。您可以使用Linux
aio
或posix
aio
接口,并将所有请求排队。驱动程序应该能够找出完成读取的最佳方式。您是否尝试了mmap,以查看性能?好的,我将尝试mmap,但这意味着完全依赖操作系统来执行正确的预读和缓冲。我希望我可以做一些更聪明的手工,因为我可以组织我的行动。类似于:read(fd,run1,…)lseek()read(fd,run2,…)lseek等,但这建议我禁用read-ahead,并自行决定什么是大间断(我应该寻找)中的小间断(我更好地阅读)。