0

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

在此处输入图像描述

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

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

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

4

3 回答 3

1

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

于 2012-05-13T16:14:27.757 回答
0

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

于 2012-05-13T16:14:38.590 回答
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。

于 2012-05-13T16:28:59.087 回答