【问题标题】:Frequently Accessing File Mapped Memory频繁访问文件映射内存
【发布时间】:2017-01-15 12:24:15
【问题描述】:

频繁访问大型(1~2 GB)文件映射内存会导致性能下降吗? (在一个紧密的循环中,比如游戏的更新循环)

据我所知,内存映射文件由操作系统缓存(使用页面错误),这使得频繁访问似乎是安全的,因为它已加载到内存中。

不过,我也认为,由于它是缓存,而不是加载,它可能会导致性能下降。

请帮助我得到正确的答案,我们将不胜感激。如果可能的话,我想知道 Linux 和 Windows 的答案,但我怀疑它们的行为会有所不同

注意:当我说“访问”时,我指的是读写。

【问题讨论】:

  • 多少内存? 1MB? 1 GB?
  • @John Zwinck 感谢您指出我错过的内容。我已经编辑了问题。

标签: c++ c file memory memory-mapped-files


【解决方案1】:

您询问有关重复访问 1-2 GB 范围的内存映射文件的问题。简短的回答是,是的,它会降低性能,尤其是在您的页面很小的情况下。

第一个问题是重复访问 1 GB 的任何内存将(默认情况下)倾向于驱逐您拥有的任何其他数据,并且 CPU 数据缓存命中率会受到影响。考虑一下典型的 CPU 数据缓存大小只有几兆字节。

第二个问题是翻译后备缓冲区。如果您使用 4 KB 的默认页面大小,则 1 GB 是 250k 页面。在 Linux 上,您应该启用“大页面”以减少访问如此大的内存区域所带来的 TLB 负载。

第三个问题是你好像没有测试过。测试对于这类事情非常重要。没有它,您将永远不会知道您遇到的是真正的问题还是只是假设的问题。

【讨论】:

    【解决方案2】:

    这主要是系统特定的。一个考虑因素是操作系统是否可以直接将内存映射到磁盘,或者是否需要一些中间转换。某些操作系统/文件系统组合允许将映射文件完全视为页面文件(提供良好的性能和读取大文件的最快方式,尤其是当它在磁盘上连续时)。其他人没有。

    我怀疑他们的行为会如此不同。

    它们实际上是完全不同的。 Windows 使用支持连续文件的硬文件系统。 Classic Unix 没有连续文件的概念

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-09
      • 2019-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多