如何尽快处理C/C++
Linux
上的大二进制文件(只读方式)?通过read
或mmap
?什么缓冲区大小? (没有提升或任何东西。)
答案 0 :(得分:6)
mmap更快,更优化。见这里的答案:
答案 1 :(得分:3)
您可以将madvise与mmap一起使用,也可以调用readahead(可能在单独的线程中,因为它是阻塞系统调用)。
如果您使用普通read(2)读取文件,请考虑使用posix_fadvise(2)并将32千字节到1M字节的缓冲区传递给read(2) ...
在足够大的地区拨打mmap
;至少几十兆字节(假设你有超过1Gb的RAM),如果你有更多可用的RAM,在更大的区域(可能是可用内存的80%)。
照顾资源限制,例如设置为setrlimit
对于不太大的文件(而不是太多的文件),你可以完全mmap
。你需要打电话,例如stat获得他们的大小。根据经验,当我在桌面计算机上读取一个(而不是几个)大文件时,如果小于3Gb,我会mmap
完全显示它。
如果性能很重要,请花些时间对应用程序和系统进行基准测试,并相应地进行调整。获取参数(如mmap-ing区域大小)是可配置的。
/proc/
文件系统,特别是来自您应用程序的/proc/self/
内部,提供了多项措施(例如/proc/self/status
,/proc/self/maps
,/proc/self/smaps
,/proc/self/statm
等)
GNU libc应该使用mmap
来阅读fopen
- FILE
模式的"rm"
。