linux - mmap如何使大文件处理更快?

标签 linux io mmap

我所知道的是 mmap 可以将进程的虚拟内存页面映射到磁盘上文件的页面。我们可以在程序中写入和读取内存,它会反射(reflect)在文件的内容中。

这种机制如何使文件的顺序读取(可能还有处理)比常规读取系统调用更快?它如何使搜索(如果文件已排序,则为二进制搜索)更快?

我从多个来源了解到 mmap 确实实现了我所说的,但我找不到任何详细说明。

最佳答案

由于限制因素是从磁盘读取,它可能不会更快...使用这两种方法,您都可以配置预读来加速顺序读取,这可能是您能做的最好的事情。

mmap() 与读取文件相比,读取文件还有其他优点:您不必关心内存管理。如果文件非常大(超过了您希望在进程中使用的内存),您将不得不自己管理保留文件的哪些部分以及丢弃哪些部分。在 mmap 的情况下,操作系统的常规内存管理例程决定文件的哪些部分保留在内存中,哪些在内存争用的情况下丢弃,密切关注整个系统的内存使用情况,而且不仅仅是您的流程。如果您决定,某些部分必须始终保留在内存中,您可以 mlock() 那些。

但在一般情况下,我没有看到很大的性能提升。

关于linux - mmap如何使大文件处理更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45192571/

相关文章:

linux - 无法在 Ubuntu 14.04 LTS 上安装 libgdamm4.0-dev

linux - 内核:在 do_execve_common 中获取命令行和 pid_parent?

Haskell:你如何检查 IO 上的运行时类型?

c++ - 在C/C++中写一个非打印字符的行为是什么?

python - Python C 模块中的映射——有什么需要注意的陷阱吗?

linux - 使用静态库配置测试

python - 在 Python 中,是 read() 还是 readlines() 更快?

c - msync的 'length`参数不起作用

linux - 启用 MAP_FIXED 标志的 nmap EPERM 错误

java - Linux - Java/文件编码