用例:巨大的图像处理。当中间数据集超出物理内存时,我将使用内存映射的临时文件。完成中间结果后,无需将中间结果存储到磁盘。当我删除它们时,numpy似乎先将所有内容刷新到磁盘,然后从文件系统中删除该文件。刷新使I / O资源和文件系统负担沉重,据我了解,鉴于此后才删除文件,从逻辑上讲是不必要的。
是否可以在不刷新其内容的情况下关闭memmap的临时文件?
答案 0 :(得分:2)
您需要使用c
模式以写时复制的形式打开内存映射。来自numpy.memmap
documentation:
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
作为模式时,更改将导致(透明地)复制更改的页面,并且当您关闭文件时,受影响的页面将再次被丢弃。
请注意,当您写入足够的页面时,操作系统将必须将内存页面交换到磁盘。这与使用超过可用内存的任何其他进程没有什么不同。关闭映射文件后,所有此类复制的页面(交换到磁盘或仍在内存中)都将再次丢弃。