我无法删除由memmap创建的文件

时间:2016-10-10 07:47:10

标签: python numpy numpy-memmap

我无法移除文件创建的numpy.memmap功能

class MyClass
 def __init__(self):    
  self.fp = np.memmap(filename, dtype='float32', mode='w+', shape=flushed_chunk_shape)
    ...
 def __del__(self):   
  del self.fp
  os.remove(filename)

当我运行del myclass(MyClass的实例)时,我遇到了错误WindowsError: [Error 32] The process cannot access the file。如果我使用memmap并以无异议方式删除文件,一切正常。所以我认为析构函数有问题。但为什么会发生呢?

1 个答案:

答案 0 :(得分:1)

在收集垃圾之前,不会取消映射Numpy memmapped文件,del self.fp无法确保垃圾回收。尚未取消映射的文件无法删除。

numpy.memmap文档说"删除将内存更改刷新到磁盘"。它没有说它是unmaps,因为它没有取消映射。

解决方案1.强制垃圾收集

import gc
...
del self.fp
gc.collect()
os.remove(filename)

您需要确保在任何地方都没有其他对fp的引用,或者即使在这种情况下它也可能不会被垃圾收集。

解决方案2.强制取消映射

self.fp._mmap.close()
del self.fp
os.remove(filename)

请注意,在第二种情况下,如果在fp关闭后有权访问fp,它可能会崩溃python解释器(不会抛出异常,只会崩溃)