1

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

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

4

1 回答 1

3

您需要使用模式将内存映射打开为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+'

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

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

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

于 2018-07-06T14:27:54.217 回答