Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我能';t删除由memmap创建的文件_Python_Numpy_Numpy Memmap - Fatal编程技术网

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解释器崩溃(不是抛出异常,只是崩溃)