用例:巨大的图像处理。当中间数据集超过物理内存时,我使用内存映射临时文件。完成后,我无需将中间结果存储到磁盘。当我删除它们时,numpy 似乎首先将它们的所有内容刷新到磁盘,然后从文件系统中删除文件。刷新对 I/O 资源和文件系统征税,据我了解,鉴于文件随后被删除,这在逻辑上是不必要的。
是否可以在不刷新其内容的情况下关闭 memmap 的临时文件?
用例:巨大的图像处理。当中间数据集超过物理内存时,我使用内存映射临时文件。完成后,我无需将中间结果存储到磁盘。当我删除它们时,numpy 似乎首先将它们的所有内容刷新到磁盘,然后从文件系统中删除文件。刷新对 I/O 资源和文件系统征税,据我了解,鉴于文件随后被删除,这在逻辑上是不必要的。
是否可以在不刷新其内容的情况下关闭 memmap 的临时文件?
您需要使用模式将内存映射打开为copy-on-writec
。从numpy.memmap
文档中:
mode : {'r+', 'r', 'w+', 'c'}, optional
文件以这种模式打开:
'r' Open existing file for reading only. 'r+' Open existing file for reading and writing. 'w+' Create or overwrite existing file for reading and writing. 'c' Copy-on-write: assignments affect data in memory, but changes are not saved to disk. The file on disk is read-only.
默认为
'r+'
。
所以默认是允许读写的,但是以这种方式改变内存映射文件确实会导致所有的变化都被写回。刷新更改可以随时发生,但是当您关闭它时肯定会发生刷新。
当您使用c
as 模式时,更改将导致更改的页面被复制(透明地),并且当您关闭文件时,受影响的页面将再次被丢弃。
请注意,当您写入足够多的页面时,操作系统将不得不将内存页面交换到磁盘。这与使用比可用内存更多的任何其他进程没有什么不同。当您关闭 mmapped 文件时,任何此类复制的页面(交换到磁盘或仍在内存中)都会再次被丢弃。