按顺序读取大文件

时间:2011-12-20 16:59:18

标签: c++ c linux io

如何尽快处理C/C++ Linux上的大二进制文件(只读方式)?通过readmmap?什么缓冲区大小? (没有提升或任何东西。)

2 个答案:

答案 0 :(得分:6)

对于只读应用程序,

mmap更快,更优化。见这里的答案:

https://stackoverflow.com/a/258097/1094175

答案 1 :(得分:3)

您可以将madvisemmap一起使用,也可以调用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"