mmap比fread更快读大文件,因其将文件直接映射为进程虚拟内存,读取即内存访问,省去内核/用户态拷贝与系统调用开销,尤其利于随机读、重复读和多线程并发读。
为什么 mmap 比 fread 更快读大文件
mmap 不走传统 I/O 缓冲路径,它把文件直接映射成进程虚拟内存的一段,后续读取就是普通的内存访问(mov 指令级别),省去了内核态/用户态多次拷贝、系统调用开销。尤其对随机读、重复读、多线程并发读大文件,优势明显。但注意:它不减少磁盘 IO 本身,只是优化了数据搬运路径。
常见误判点:mmap 并非“一定更快”——小文件(
Linux 下 mmap 读取大文件的最小可靠写法
核心是正确处理 mmap 返回地址、长度对齐、以及 MAP_PRIVATE / MAP_SHARED 的选择。对只读场景,优先用 MAP_PRIVATE,避免写时复制(COW)干扰。
-
open()必须带O_RDONLY,且检查返回值是否为 -1 -
lseek()或fstat()获取真实文件大小,不能依赖stat.st_size未刷新的情况 -
mmap()的length参数必须 ≤ 文件大小;若传入 > 文件大小,映射区域末尾读取会触发SIGBUS - 映射后记得
munmap(),否则泄漏虚拟内存(虽不占物理内存,但耗vm.max_map_count)
示例关键片段:
立即学习“C++免费学习笔记(深入)”;