【问题标题】:How does a memory mapped file work for files larger than memory?内存映射文件如何处理大于内存的文件?
【发布时间】:2016-12-23 01:27:45
【问题描述】:

我正在尝试使用比我的内存大的数据文件。

到目前为止,我的理解是它将文件中的每个字节映射到虚拟内存中的地址。数据仅在您真正需要时(例如访问特定条目)才被读取到实际内存中,并且以称为页面的块的形式读取。

但是,如果我最终要处理该数据文件中的所有内容,这是否意味着最终需要将所有内容读入真实内存?操作系统是否会自动决定要释放内存中的哪些部分数据,以便为额外数据腾出空间?

对于这个特定的项目,我正在 Linux 上使用 Python,如果这有什么不同的话。 numpy.memmap

【问题讨论】:

  • 大于可用物理内存还是大于可用虚拟地址空间?

标签: python numpy memory-management memory-mapped-files


【解决方案1】:

视情况而定。

内存映射文件的工作方式与传统 paging 的工作方式几乎完全相同,只不过操作系统不是在内存和页面文件之间移动数据,而是在内存和您指定的某个任意文件之间移动数据。

因此,如果您的物理内存(即主板上的实际 RAM 芯片)用完,也没关系。操作系统只会分页它认为您不会使用的文件的任何部分。如果它猜错了,你的性能会很差,但你不会崩溃或任何事情。

但如果您的虚拟内存或地址空间用完,那就不行了。在这种情况下,您的程序会用完内存地址,并且无法再分配内存。您也将无法扩大文件的内存映射区域。对于 32 位程序,该限制略小于 4 GB(精确的限制因操作系统和编程环境而异,并且取决于这些系统的开销)。对于 64 位程序,限制通常很大,但具体有多大取决于您的架构和操作系统。

【讨论】:

  • 所以假设你要映射一个超出物理内存的大文件,如果你从字节偏移量 0 开始读取到末尾,然后流式传输它(完成后删除块),操作系统将通过在您正在阅读的点上分页来处理它,然后分页它认为您不再使用的块?
  • 请看下面的链接。第三段提到了你的问题的答案:gnu.org/software/libc/manual/html_node/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-02
  • 1970-01-01
  • 2021-08-02
  • 2011-10-11
  • 1970-01-01
  • 2016-02-23
相关资源
最近更新 更多