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

时间:2012-07-17 16:46:00

标签: c++ c linux-kernel hard-drive

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

  • 我事先知道需要提取的页面的偏移量。
  • 有很长一段连续的页面。
  • 可能存在小的不连续性。
  • 可能存在很长的不连续性。
  • 所有偏移都是有序的(没有后退动作)。

此类偏移列表的示例: 1,2,3,4,5,6,7,8,1000,1001,1003,1004,1005,1010,1011,1012,31004,31005,31006。

我对使用哪种策略以获得最佳表现感到困惑。

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

1 个答案:

答案 0 :(得分:1)

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