c++ - 使用 linux 功能读取 block 的不连续运行

标签 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 个 block 好吗?
  • 使用 O_DIRECT 打开文件并管理我自己,即:交替进行长时间读取和查找。在这种情况下我应该禁用预读吗?

最佳答案

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

关于c++ - 使用 linux 功能读取 block 的不连续运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11527130/

相关文章:

c# - 调用 C++ 函数时尝试读取/写入 protected 内存错误

c++ - 数组并使用数组作为索引

linux-kernel - module_init() 与 core_initcall() 与 early_initcall()

linux-kernel - Linux 设备驱动程序能否在 device_remove() 函数中等待 DMA 终止?

linux-kernel - 确保内存支持 DMA

c++ - 使用 getline 从输入文件流中读取字符串和数字

使用 STL 容器和 typedef 的 C++ 模板类

c - pthreads : difference due to malloc and direct declaration

c++ - C++ 中的快速输入/输出

c - 需要明确 OpenCV 中 cvCaptureFromFile 的用法