python - 是否可以在不刷新其内容的情况下关闭 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 文件时,任何此类复制的页面(交换到磁盘或仍在内存中)都会再次被丢弃。
推荐阅读
- java - 有没有办法将参数作为值传递到 sql 表中?
- java - 搜索支持 PAC 脚本和用 JAVA 编写的基本身份验证的预代理
- python - 如何设置我的 Django 函数以从按钮 onclick 在后台运行?
- vector - 如何在 Rust 中使用分隔符连接向量向量?
- arrays - 在 Julia 中按列堆叠数组
- algorithm - 将带有向量 v_i 和乘法 v_i * B 的树节点重构为一个矩阵乘法 A * B
- c# - 如何制作一个只能订阅一次的轻量级“重播”运算符?
- css - 我在 prestashop 上有 5 张不同的图片,但大约有 150.000 种产品,所以现在我有 22gb 的产品图片
- powerbi - Power BI:创建经理列的经理
- microcontroller - MSP430 停止响应高频查询