Я не могу удалить файл, созданный memmap

Я не могу удалить созданный файл numpy.memmap Funtion

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 ответ

Решение

Numpy memmapped файлы не отображаются, пока мусор не будет собран, и del self.fp не обеспечивает сборку мусора. Файл, который еще не отображен, не может быть удален.

Документы numpy.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 (не исключение, а просто крах)

Другие вопросы по тегам