是否可以在不刷新其内容的情况下关闭 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 将不得不将内存页面交换到磁盘。这与使用超过可用内存的任何其他进程没有什么不同。当您关闭映射文件时,任何此类复制的页面(交换到磁盘或仍在内存中)将再次被丢弃。
用例:大量图像处理。当中间数据集超过物理内存时,我使用内存映射临时文件。完成中间结果后,我不需要将它们存储到磁盘。当我删除它们时,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 将不得不将内存页面交换到磁盘。这与使用超过可用内存的任何其他进程没有什么不同。当您关闭映射文件时,任何此类复制的页面(交换到磁盘或仍在内存中)将再次被丢弃。