加速读取Linux应用程序

时间:2012-05-13 15:54:33

标签: linux caching

我的程序读取一个文件,交错如下:

enter image description here

要读取的文件很大。它分为四个部分,然后分成许多块。我的程序首先读取第1部分的第1块,然后跳转到第2部分的第1块,依此类推。然后回到第1部分的第2块,......,就这样。

测试中的性能下降。我相信原因是内核的页面缓存功能在这种情况下无法有效工作。但是文件太大而不能mmap(),文件位于NFS。

在这种情况下如何加快阅读速度?欢迎提出任何意见和建议。

3 个答案:

答案 0 :(得分:1)

您可能希望使用posix_fadvise()为系统提供有关您的使用情况的提示,例如:使用POSIX_FADV_RANDOM禁用预读,并可能使用POSIX_FADV_WILLNEED让系统在您需要之前尝试将下一个块读入页面缓存(如果您可以预测这一点)。 一旦完成读取块以使系统释放底层缓存页面,您也可以尝试使用POSIX_FADV_DONTNEED,尽管这可能不是必需的

答案 1 :(得分:0)

对于每对块,读取两个块,处理第一个块,然后将第二个块读入堆栈。当你到达文件末尾时,开始从堆栈底部移动值,逐个处理它们。

答案 2 :(得分:0)

您可以将读数分解为线性块。例如,如果您的代码如下所示:

int index = 0;
for (int block=0; block<n_blocks; ++block) {
  for (int part=0; part<n_parts; ++part) {
    seek(file,part*n_blocks+block);
    data[part] = readChar(file);
  }
  send(data);
}

将其更改为:

for (int chunk=0; chunk<n_chunks; ++chunk) {
  for (int part=0; part<n_parts; ++part) {
    seek(file,part*n_blocks+chunk*n_blocks_per_chunk);
    for (int block=0; block<n_blocks_per_chunk; ++block) {
      data[block*n_parts+part] = readChar(file);
    }
  }
  send(data);
}

然后为缓存优化n_blocks_per_chunk。