使用 dbms 样式访问模式读取文件的最佳方法是什么?我的意思是:
- 我事先知道我需要获取的页面的偏移量。
- 有很长的连续页面。
- 可能会有小的不连续性。
- 可能会有很长的间断。
- 所有偏移都是有序的(没有来回移动)。
此类偏移列表的示例: 1,2,3,4,5,6,7,8,1000,1001,1003,1004,1005,1010,1011,1012,31004,31005,31006.
我对使用哪种策略以获得最佳性能感到有点困惑。
- 我应该依赖 Linux 页面管理器吗?如何?将循环通过 偏移并一次读取 1 个 block 好吗?
- 使用 O_DIRECT 打开文件并管理我自己,即:交替进行长时间读取和查找。在这种情况下我应该禁用预读吗?
最佳答案
我不知道它最终是否是“最好的”,但我可能会 mmap()
文件,然后使用 madvise()
尝试强制系统预故障页面范围。显然,这还需要对您的偏移列表进行一些计算以识别连续范围(好吧,它实际上不需要它,但这会减少 madvise()
调用并获得一点效率如果有很多这样的范围)。预故障前多远取决于您在每个页面/范围上花费多少时间来进行您尝试进行的任何计算,因此需要进行一些测试/调整。您还可以使用 madvise()
来提示您在使用完某个范围后不再需要它,因此它可能会被排到下一个待释放列表的前面。
关于c++ - 使用 linux 功能读取 block 的不连续运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11527130/