Укроп удаляет объект при использовании "загрузки"
У меня ошибка, которая сводит меня с ума. Я генерирую некоторые данные численного моделирования sim_data.dill
и сохранить его в каталог на моем компьютере, используя
with open(os.path.join(original_directory, 'sim_data.dill'), 'w' as f:
dill.dump(outputs, f)
Эти данные составляют около 1 Гб и на их создание требуется некоторое время. Теперь я скопировал этот файл из original_directory
в new_directory
когда я пытаюсь загрузить его из другой программы, используя
simfile = '/new_directory/sim_data.dill'
with open(simfile, 'r') as f:
outputs = dill.load(f)
Происходит одно из двух:
- программа говорит, что файл отсутствует с
UnpicklingError: [Errno 2] No such file or directory: .../
original_directory/sim_data.dill
, Это означает, что укроп кладет вoriginal_directory
в метаданных файла и отказывается открывать его при перемещении файла; действительно ужасающее поведение. - когда я копирую файл обратно в
new_directory
, пытаясь открыть это даетEOFError
и укроп изменяет файл на ноль байтов, по существу удаляя его. Это еще хуже.
Я могу читать файл очень хорошо, используя стандартный with open(simfile, 'r') as f; print f.readlines()
, но, очевидно, это не помогает при попытке восстановить внутреннюю структуру классов файлов.
1 ответ
Видимо это нормальное поведение для dill
; посмотри пожалуйста:
https://github.com/uqfoundation/dill/issues/296
Перефразируя: местоположение файла является частью дескриптора файла, который нужно выбрать, поэтому удаление этого без этой информации невозможно. Это означает, по-видимому, что если вы сохраните .dill
файл в одном месте, переместите файл вручную (например, в более удобный каталог), а затем попробуйте открыть его снова, он не будет работать.
С точки зрения вопроса удаления автор поста выше рекомендует использовать fmode=FMODE_PRESERVEDATA
или один из других файловых режимов, перечисленных по адресу https://github.com/matsjoyce/dill/blob/087c00899ef55f31d36e7aee51a958b17daf8c91/dill/dill.py