在C语言中读取文件的最佳缓冲区大小

19

我需要使用 read 函数在 C 语言中读取大文件。我想知道缓冲区的大小是否对性能有影响。这些文件的大小可能会达到几十GB。


当然缓冲区大小很重要,但是“最佳”取决于情况。 - Matt Ball
越大越好,但要在合理范围内。使用缓冲区大小为2的幂次方(或至少是512的倍数)会带来一些小优势。 - Hot Licks
@HotLicks能否解释一下为什么512 - Aman Deep Gautam
2
如果您使用的是Posix系统,则fstat会告诉您要使用什么大小(st_blksize)。它告诉您的数字是否真正是最佳的另当别论,实际上它是下限,低于该下限,实现者几乎可以确定I/O将明显不够优化。当您进行测试时,您可能会发现此大小为您提供了更大缓冲区可用性中的大部分收益,但如果您将其乘以较小的数字,则仍然可以获得一些性能提升。 - Steve Jessop
@AmanDeepGautam -- 扇区大小。大多数硬盘使用至少512的扇区大小(在某些品牌中可能达到4096甚至更大)。扇区大小几乎总是2的幂,如果您不在扇区边界上发出读取请求,则驱动器将不得不丢弃它读取的一些字节(如果您不在扇区边界上写入,则情况会变得非常糟糕)。 - Hot Licks
2个回答

10

简短版本。
这要视情况而定。在x86上,缓冲区大小为4096字节是一个不错的开始(一个页面大小高级格式块大小)。

详细版本。
在UNIX中,这取决于内核、libc、文件系统、硬件等等。不仅取决于版本和编译选项,还取决于运行时可调整参数(例如预读取设置)。

自己动手。
测试一下吧!参考UNIX环境高级编程第3.9章“I/O效率”,以确定适用于特定系统的最佳读写缓冲区大小。


0

首先:必须是磁盘逻辑/物理扇区大小的倍数,您可以使用hdparm进行检查。这是相同的

提示:libc的fopen(3)fread(3)fwrite(3)等函数已经为您做了一些良好的缓冲。

另一个提示:如果您不需要流式传输整个文件,而是需要随机访问其中的部分,可以尝试使用mmap()


1
操作系统即使在没有特别指示(O_DIRECT/O_SYNC)的情况下,也会使用大量缓存(页面缓存+预读取)进行缓冲,以便进行open|read|write等操作。 - SaveTheRbtz

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