【问题标题】:How can mmap make large file processing faster?mmap如何让大文件处理更快?
【发布时间】:2017-12-24 20:15:20
【问题描述】:

我所知道的是 mmap 可以将进程的虚拟内存页面映射到磁盘上文件的页面。我们可以在程序中对内存进行读写操作,它会反映在文件的内容中。

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

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

【问题讨论】:

  • 与内存访问相比,系统调用非常慢。在mmap 的情况下,将从文件中提取一定数量的页面并加载到分配给进程的物理页面中。仅当您读/写的内容超过已加载的内容时,才会出现页面错误并且处理器将进入内核。但是如果你使用重复的reads,大部分时间都会有一个系统(操作系统确实缓冲一点),它会更慢。
  • @AjayBrahmakshatriya 如果读取大块数据,系统调用开销可以忽略不计。不过,您不应该尝试按字节读取文件...
  • @Ctx 用户提到了二分搜索。所以我认为他们会在文件中执行一系列 fseek 和小 freads。
  • @AjayBrahmakshatriya fread 没问题,因为它是缓冲的。

标签: linux io mmap


【解决方案1】:

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

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

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

【讨论】:

  • 避免了一个复制步骤。但实际上,与 实际 I/O 的开销相比,如果您假设内容只需要一次,这将是非常少的。
  • @FelixPalmen 你确定在阅读的情况下完成了额外的副本吗?内核可以将用户的物理页面与已读取文件的页面交换。
  • @AjayBrahmakshatriyaread() 的 POSIX 接口让调用者提供一个缓冲区,这个缓冲区可以与程序的任何其他数据共享它的页面。所以是的,数据必须复制到那里。也许原始系统调用的工作方式会有所不同。
  • @FelixPalmen 是的,我同意。物理页面也可以与其他虚拟地址范围(甚至其他进程)共享,但内核知道所有页面的映射位置,它可以在所有位置替换新页面。这将比复制所有数据快得多。
  • @AjayBrahmakshatriya mmap() 的界面完全允许这种映射方法,而不会出现问题/解决方法。
猜你喜欢
  • 1970-01-01
  • 2015-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-17
  • 2010-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多