如何在C语言中打开和读取文件而不使用缓冲区?

3

我希望对一个操作文件的算法进行基准测试。该算法迭代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 *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;
}

我知道操作系统有热缓存和冷缓存。我想要实现冷缓存的情况。在每次运行run_algorithm()时,打开文件时不应该进行任何缓冲。换句话说,我不希望操作系统将文件的一部分存储在内存中以加快open()和seek()的速度。

有没有一种特定的方法可以设置open()和seek()而不进行缓冲?


3
不行,即使你告诉操作系统不要缓存,你也无法确定驱动控制器或内置磁盘缓存是否会影响它。 - Martin Beckett
你正在使用Linux系统吗?如果是的话,你能在open()调用中使用O_DIRECT吗?这可能会减少系统在写操作期间进行的缓存量。但是你进入了敏感领域,系统将采取非常严格的措施来确保磁盘数据被缓存。 - Jonathan Leffler
为什么不在main中打开文件并将FILE *fp参数传递给run_algorithm,这样您就不需要重复打开/关闭文件了?您可以将for循环移动到run_algorithm中。同时,将一个指向int的指针(或数组地址)传递给run_algorithm,并构建一个偏移量数组,让run_algorithm返回该数组的指针(同时也能够使用作为函数指针传递的数组)。 - David C. Rankin
1个回答

3

你无法完全禁用硬盘和操作系统中的所有缓存。

但是,如果你接受在程序之外对所有内容进行基准测试,那么可以在C运行时库中禁用缓冲。

setvbuf(fd, NULL, _IONBF, 0);

你必须在fopen操作后立即调用该函数。有关详细信息,请参见cpp参考页面

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接