是否可以在不刷新其内容的情况下关闭 memmap 的临时文件?

Is it possible to close a memmap'd temporary file without flushing its contents?

用例:大量图像处理。当中间数据集超过物理内存时,我使用内存映射临时文件。完成中间结果后,我不需要将它们存储到磁盘。当我删除它们时,numpy 似乎先将它们的所有内容刷新到磁盘,然后从文件系统中删除文件。刷新正在对 I/O 资源和文件系统征税,据我所知,鉴于文件随后被删除,这在逻辑上是不必要的。

是否可以在不刷新其内容的情况下关闭 memmap 的临时文件?

您需要使用 c 模式以 写时复制 打开内存映射。来自 numpy.memmap documentation:

mode : {'r+', 'r', 'w+', 'c'}, optional

The file is opened in this mode:

'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.

Default is 'r+'.

所以默认是允许读取和写入的,但是以这种方式更改内存映射文件确实会导致所有更改被写回。刷新更改随时可能发生,但是当您关闭它时肯定会发生刷新。

当您使用 c 作为模式时,更改将导致更改的页面被复制(透明),并且当您关闭文件时,因此受影响的页面将再次被丢弃。

请注意,当您写入足够多的页面时,OS 将不得不将内存页面交换到磁盘。这与使用超过可用内存的任何其他进程没有什么不同。当您关闭映射文件时,任何此类复制的页面(交换到磁盘或仍在内存中)将再次被丢弃。