Python 我能';t删除由memmap创建的文件
我无法删除创建的文件Python 我能';t删除由memmap创建的文件,python,numpy,numpy-memmap,Python,Numpy,Numpy Memmap,我无法删除创建的文件numpy.memmapFunction 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的实
numpy.memmap
Function
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]进程无法访问该文件。如果我使用memmap
并以非面向对象的方式删除文件,一切正常。所以我在分解器中考虑故障。但是为什么会发生这种情况呢?Numpy memmapped文件在垃圾收集之前不会取消映射,并且del self.fp
不能确保垃圾收集。无法删除尚未取消映射的文件
memmap文档说“删除会将内存更改刷新到磁盘”。它没有说它取消映射,因为它没有取消映射
解决方案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解释器崩溃(不是抛出异常,只是崩溃)