我的程序读取一个文件,交错如下:
要读取的文件很大。它分为四个部分,然后分成许多块。我的程序首先读取第 1 部分的第 1 块,然后跳转到第 2 部分的第 1 块,依此类推。然后回到第 1 部分的第 2 部分,...,这样。
在测试中性能下降。我相信原因是内核的页面缓存功能在这种情况下不能有效地工作。但是文件太大了mmap()
,而且文件位于 NFS 中。
在这种情况下如何加快阅读速度?欢迎任何意见和建议。
您可能希望用于posix_fadvise()
向系统提示您的使用情况,例如。用于POSIX_FADV_RANDOM
禁用预读,并可能用于POSIX_FADV_WILLNEED
让系统在您需要之前尝试将下一个块读入页面缓存(如果您可以预测的话)。您也可以在完成读取块后尝试使用POSIX_FADV_DONTNEED
以使系统释放底层缓存页面,尽管这可能不是必需的
对于每一对块,都读入,处理第一个,然后将第二个压入堆栈。当您到达文件末尾时,开始将值从堆栈底部移出,逐个处理它们。
您可以将读数分解为线性块。例如,如果您的代码如下所示:
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。