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

I can't remove file, created by 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 并以无反对的方式删除文件,一切正常。所以我认为析构函数有问题。但为什么会这样?

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

numpy.memmap 文档说 "Deletion flushes memory changes to disk"。它没有说取消映射,因为它没有取消映射。

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

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

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

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

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

注意第二种情况,如果fp关闭后还有访问权限,很可能会导致python解释器崩溃(不是抛出异常,只是崩溃)