【问题标题】:Numpy memmap with file deletion带有文件删除的 Numpy memmap
【发布时间】:2017-06-22 05:42:49
【问题描述】:

是否有可能有一个 Numpy memmap 文件,当 memmap 数组被垃圾回收时,该文件将被删除?

我试过了:

import tempfile
import numpy as np
arr = np.memmap(tempfile.NamedTemporaryFile(), mode='w+',
                shape=(10, 10), dtype=np.int)
os.path.exists(arr.filename) # False

但似乎没有保留对临时文件的引用,因此被删除了。

我不想在临时文件上使用上下文管理器,因为我希望能够从函数返回数组并让文件一直存在,直到不再使用数组。

注意:这里有类似的问题:In Python, is it possible to overload Numpy's memmap to delete itself when the memmap object is no longer referenced?,但提问者对 Python 范围和 tempfile 模块的了解不足。

【问题讨论】:

  • 看起来tempfilememmap 之间存在一些棘手的交互。如果先创建临时文件,或者我使用自己的文件名,则该文件存在,os.path 和操作系统文件管理器都存在。以您的方式创建文件可能不存在于内存缓冲区之外。还可以使用 delete=False 进行实验。
  • 您对链接 SO 的简短讨论似乎回答了您的问题。这一切都与操作系统的交互以及tempfile 如何创建文件有关。

标签: python numpy mmap temporary-files


【解决方案1】:

事实证明,jtaylor's answer 最初链接的问题是正确的。所以代码:

import tempfile
import numpy as np
with tempfile.NamedTemporaryFile() as ntf:
    temp_name = ntf.name
    arr = np.memmap(ntf, mode='w+',
                    shape=(10, 10), dtype=np.int)
print(arr)

由于操作系统管理文件的方式,即使os.path.exists(temp_name) 为假,也可以按需要工作。文件路径 (temp_name) 未链接,不再可通过文件系统访问,但实际文件磁盘使用情况将保持可用,直到打开的文件关闭,memmap 对象将保留该文件。

【讨论】:

    猜你喜欢
    • 2018-01-15
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    相关资源
    最近更新 更多