2017-06-22 106 views
1

当memmap数组被垃圾收集时,是否有可能删除Numpy memmap文件?带有文件删除的Numpy 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模块的了解。

+0

看起来'tempfile'和'memmap'之间存在一些棘手的相互作用。如果临时文件是首先创建的,或者我使用自己的文件名,那么这个文件就存在于'os.path'和一个OS文件管理器中。创建你的方式文件可能不存在于内存缓冲区之外。还可以用'delete = False'进行实验。 – hpaulj

+1

它看起来像你关于链接SO的简短讨论回答你的问题。这一切都与操作系统的交互以及'tempfile'如何创建文件有关。 – hpaulj

回答

0

事实证明,原来连接的问题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对象将保留该文件)。