Подтвердить что ты не робот

Поддерживает ли hdf5 одновременное чтение или запись в разные файлы?

Я пытаюсь понять пределы hdf5 concurrency.

Есть две сборки hdf5: параллельная HDF5 и по умолчанию. Параллельная версия в настоящее время поставляется в Ubuntu, а по умолчанию - в Anaconda (определяется значком "--enable-parallel" ).

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

  • несколько процессов, считываемых из одного файла
  • несколько процессов чтения из разных файлов
  • несколько процессов, записывающих разные файлы.

Кроме того, есть ли какие-либо причины, по которым anaconda не имеет флажка -nable-parallel по умолчанию? (https://github.com/conda/conda-recipes/blob/master/hdf5/build.sh)

4b9b3361

Ответ 1

AFAICT, существует три способа создания libhdf5:

  • без поддержки потоков и поддержки MPI (как в рецепте conda, который вы опубликовали)
  • с поддержкой MPI, но без безопасности потока
  • с безопасностью потока, но без поддержки MPI.

То есть флаги --enable-threadsafe и --enable-parallel являются взаимоисключающими (https://www.hdfgroup.org/hdf5-quest.html#p5thread).

Что касается одновременного чтения одного или даже нескольких файлов, ответ заключается в том, что вам нужна безопасность потоков (https://www.hdfgroup.org/hdf5-quest.html#tsafe):

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

Пользователи часто удивляются, узнав, что (1) одновременный доступ к различные наборы данных в одном файле HDF5 и (2) одновременный доступ к для разных файлов HDF5 требуется поточная версия HDF5 библиотека. Хотя каждый поток в этих примерах обращается к различным данных, библиотека HDF5 изменяет глобальные структуры данных, которые независимо от конкретного набора данных HDF5 или файла HDF5. HDF5 полагается на семафор вокруг API библиотеки вызывает в потокобезопасной версии библиотеки для защиты структуры данных от коррупции одновременная манипуляция из разных потоков. Примеры HDF5 библиотеки, которые должны быть защищены, являются менеджер freespace и открытые списки файлов.

Хотя в проходе упоминаются только параллельные потоки для одного процесса, он, по-видимому, применяется в равной степени к разветвленным подпроцессам: см. этот пример h5py многопроцессорность.

Теперь для параллельного доступа вы можете использовать "Parallel HDF5", но для этих функций требуется использование MPI. Этот шаблон поддерживается h5py, но более сложный и эзотерический и, вероятно, даже менее переносимый, чем потокобезопасный режим. Что еще более важно, попытка наивно выполнять параллельные чтения с параллельной сборкой libhdf5 приведет к неожиданным результатам, потому что библиотека не является потокобезопасной.

Помимо эффективности, одним из ограничений флагового флага сборки является отсутствие поддержки Windows (https://www.hdfgroup.org/hdf5-quest.html#gconc):

Нитевидная версия HDF5 в настоящее время не протестирована или не поддерживается на платформах MS Windows. Пользователь смог заставить это работать Windows 64-bit и предоставил свои 64-битные Windows Pthreads.

Получение странных коррумпированных результатов при чтении (разных!) файлов из Python, безусловно, является неожиданным и разочаровывающим, учитывая, что одновременный доступ к чтению является одной из популярных функций HDF5. Возможно, лучшим рецептом по умолчанию для conda будет включение --enable-threadsafe на тех платформах, которые его поддерживают, но я предполагаю, что в конечном итоге вы столкнетесь с спецификой платформы. Может быть, должны быть отдельные пакеты для трех режимов сборки?