我需要使用 read
函数在 C 语言中读取大文件。我想知道缓冲区的大小是否对性能有影响。这些文件的大小可能会达到几十GB。
简短版本。
这要视情况而定。在x86上,缓冲区大小为4096字节是一个不错的开始(一个页面大小和高级格式块大小)。
详细版本。
在UNIX中,这取决于内核、libc、文件系统、硬件等等。不仅取决于版本和编译选项,还取决于运行时可调整参数(例如预读取设置)。
自己动手。
测试一下吧!参考UNIX环境高级编程第3.9章“I/O效率”,以确定适用于特定系统的最佳读写缓冲区大小。
首先:必须是磁盘逻辑/物理扇区大小的倍数,您可以使用hdparm进行检查。这是相同的
提示:libc的fopen(3)
、fread(3)
、fwrite(3)
等函数已经为您做了一些良好的缓冲。
另一个提示:如果您不需要流式传输整个文件,而是需要随机访问其中的部分,可以尝试使用mmap()
。
O_DIRECT
/O_SYNC
)的情况下,也会使用大量缓存(页面缓存+预读取)进行缓冲,以便进行open|read|write
等操作。 - SaveTheRbtz
512
? - Aman Deep Gautamfstat
会告诉您要使用什么大小(st_blksize
)。它告诉您的数字是否真正是最佳的另当别论,实际上它是下限,低于该下限,实现者几乎可以确定I/O将明显不够优化。当您进行测试时,您可能会发现此大小为您提供了更大缓冲区可用性中的大部分收益,但如果您将其乘以较小的数字,则仍然可以获得一些性能提升。 - Steve Jessop