内存映射文件如何适用于大于内存的文件?

时间:2016-12-22 17:19:19

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

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

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

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

对于这个特定项目,我在Linux上使用Python,如果这有任何区别的话。 numpy.memmap

1 个答案:

答案 0 :(得分:2)

取决于。

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

因此,如果您的物理内存(即主板上的实际RAM芯片)耗尽,那就没问题了。操作系统只会将其认为您不会使用的文件中的任何部分分页。如果它猜错了,你的表现会很糟糕,但你不会崩溃或任何事情。

但如果你的虚拟内存或地址空间不足,那就不行了。在这种情况下,您的程序将耗尽内存地址,并且将无法再分配内存。您还将无法扩展文件的内存映射区域。对于32位程序,限制略小于4 GB(精确限制因操作系统和编程环境而异,并取决于这些系统的开销)。对于64位程序,限制通常是巨大的,但确切的程度将取决于您的体系结构和操作系统。