内存映射文件如何处理大于内存的文件?

cac*_*tus 7 python memory-management numpy memory-mapped-files

我正在尝试处理比我的内存大的数据文件。

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

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

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

Kev*_*vin 5

这取决于。

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

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

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