Поврежденные файлы при создании файлов HDF5 без их закрытия (h5py)


Я использую h5py для хранения экспериментальных данных в контейнере HDF5.

В интерактивном сеансе я открываю файл, используя:

measurement_data = h5py.File('example.hdf5', 'a')

Затем я записываю данные в файл, используя некоторые самописные функции (может быть много ГБ данных из эксперимента за пару дней). В конце эксперимента я обычно закрывал файл, используя

measurement_data.close()

К сожалению, время от времени случается, что интерактивная сессия заканчивается без моего явного закрытия файла (случайно убивая сеанс, отключение питания, сбой ОС из-за какого-то другого программного обеспечения). Это всегда приводит к повреждению файла и потере полных данных. Когда я пытаюсь открыть его, я получаю ошибку:

OSError: Unable to open file (File signature not found)

Я также не могу открыть файл в HDFview или любом другом программном обеспечении, которое я пробовал.

  1. есть ли способ избежать повреждения файла, даже если он не закрыт явно? Я читал об использовании оператора with здесь , но я не уверен, что это поможет, когда сеанс неожиданно концы.
  2. могу ли я каким-то образом восстановить данные в поврежденных файлах? Существует ли программа ремонта?

Всегда открывать и закрывать файл для каждого доступа к записи звучит довольно неблагоприятно для меня, потому что я постоянно пишу данные из многих различных функций и потоков. Так что я был бы более доволен другим решением.

2 3

2 ответа:

Проблема коррупции известна разработчикам HDF5. Они работают над исправлением этого в версии 1.10, добавив журналирование . В то же время вы можете периодически звонить flush(), чтобы убедиться, что ваши записи были сброшены, что должно свести к минимуму некоторые повреждения. Вы также можете попробовать использовать внешние ссылки , которые позволят вам хранить фрагменты данных в отдельных файлах, но связывать их вместе в одну структуру при чтении.

Ничто не помешает файлу быть поврежденным в случае, например, отключения электроэнергии. Все, что вы можете сделать, это минимизировать ущерб. Один из способов сделать это-использовать избыточность. Вы используете два файла вместо одного, и только один из них открывается в любое время. Скажем, файл 1 открыт, вы записываете все свои изменения в файл 1. Через некоторое время или некоторое количество записанных данных закройте его, обновите файл 2 из файла 1 и продолжайте запись в файл 2 и так далее поочередно.