我无法移除文件创建的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
并以无异议方式删除文件,一切正常。所以我认为析构函数有问题。但为什么会发生呢?
答案 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解释器(不会抛出异常,只会崩溃)