我的程序读取一个文件,交错如下:
要读取的文件很大。它分为四个部分,然后分成许多块。我的程序首先读取第1部分的第1块,然后跳转到第2部分的第1块,依此类推。然后回到第1部分的第2块,......,就这样。
测试中的性能下降。我相信原因是内核的页面缓存功能在这种情况下无法有效工作。但是文件太大而不能mmap()
,文件位于NFS。
在这种情况下如何加快阅读速度?欢迎提出任何意见和建议。
答案 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。