如何在C语言中无缓冲地打开和读取文件?
我想对一个在文件上运行的算法进行基准测试。该算法迭代N轮,每轮读取一个数据块,做一些神奇的事情,并设置下一个块的偏移量 以下是伪代码:如何在C语言中无缓冲地打开和读取文件?,c,io,C,Io,我想对一个在文件上运行的算法进行基准测试。该算法迭代N轮,每轮读取一个数据块,做一些神奇的事情,并设置下一个块的偏移量 以下是伪代码: int run_algorithm(int offset) { char *fname = "database.dat"; fd = open(fname, O_RDONLY); // read the desired block to memory block_size = 1024 * 1024; char *bu
int run_algorithm(int offset) {
char *fname = "database.dat";
fd = open(fname, O_RDONLY);
// read the desired block to memory
block_size = 1024 * 1024;
char *buf = malloc(block_size);
lseek(fd, offset, SEEK_SET);
read(fd, &buf, block_size);
int new_offset;
// do magic stuff with buf
// and set a new offset
close(fd);
return new_offset;
}
int main() {
int i;
//init offset
int offset = 0;
// iterate N times
for (i = 0; i < N; i++) {
offset = run_algorithm(offset);
}
return 0;
}
int运行算法(int偏移量){
char*fname=“database.dat”;
fd=打开(仅fname,Ordu);
//将所需的块读取到内存中
块大小=1024*1024;
char*buf=malloc(块大小);
lseek(fd、偏移、寻道集);
读取(fd和buf、块大小);
int新_偏移量;
//用buf做魔术
//并设置一个新的偏移量
关闭(fd);
返回新的_偏移量;
}
int main(){
int i;
//初始偏移量
整数偏移=0;
//迭代N次
对于(i=0;i
我知道操作系统有热缓存和冷缓存。我想实现冷缓存案例。在每个run_algorithm()调用中,打开文件时不应有缓冲。换句话说,我不希望操作系统将文件的一部分存储在内存中的某个地方,以加速open()和seek()
有没有办法专门设置open()和seek(),而无需缓冲?您不能禁用硬盘驱动器和操作系统中的所有缓存 但如果您接受对程序之外的所有内容进行基准测试,则可以在C运行时库中禁用缓冲:
setvbuf(fd, NULL, _IONBF, 0);
必须在fopen操作后立即调用该函数。请参阅。否中的详细信息,即使您可以告诉操作系统不要缓冲,您也不知道驱动器控制器或板载磁盘缓存是否会影响它。您是在Linux设备上吗?如果是,您可以在
open()
调用中使用O\u DIRECT
?这可能会减少系统执行的缓存量,至少在写操作期间是这样。但是,您进入了敏感区域,系统将非常长的时间来确保磁盘数据被缓存。为什么不在main
中打开您的文件,并将file*fp
参数传递给run\u algorithm
以避免重复打开/关闭文件?您可以将for
循环移动到run\u算法
,还可以将指向int
(或数组地址)的指针传递到run\u算法
,构建偏移数组,并让run\u算法
返回指向数组的指针(以及能够使用作为函数指针传递的数组)