Могу ли я записать файл HDF5 из нескольких процессов/потоков?

Поддерживает ли hdf5 параллельную запись в один и тот же файл из разных потоков или из разных процессов? В качестве альтернативы, поддерживает ли hdf5 неблокирующую запись?

Если да, то поддерживается ли это также NetCDF4 и привязками python для любого из них?

Я пишу приложение, в котором хочу, чтобы разные ядра ЦП одновременно вычисляли выходные данные, предназначенные для неперекрывающихся плиток очень большого выходного массива. (Позже я захочу читать разделы из него как единый массив, не нуждаясь в собственном драйвере для управления индексацией множества отдельных файлов и, в идеале, без дополнительной задачи ввода-вывода по переупорядочению его на диске.)


person benjimin    schedule 06.02.2018    source источник


Ответы (2)


Не тривиально, но есть различные потенциальные обходные пути.

Обычная библиотека HDF5, по-видимому, даже не поддерживает одновременное чтение разных файлов несколькими потоками. Следовательно, NetCDF4 и привязки Python для них не будут поддерживать параллельную запись.

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

В более поздних версиях HDF5 должна быть поддержка виртуальных наборов данных. Каждый процесс будет записывать выходные данные в другой файл, а затем будет создан новый файл-контейнер, состоящий из ссылок на отдельные файлы данных (но в остальном его можно будет читать как обычный файл HDF5).

Существует библиотека "Parallel HDF5" для MPI. Хотя в противном случае MPI может показаться излишним, у него есть преимущества при масштабировании позже на несколько машин.

Если запись вывода не является узким местом производительности, многопоточное приложение, вероятно, могло бы реализовать один поток вывода (используя некоторую форму структуры данных очереди).

[Изменить:] Другой вариант — использовать вместо этого формат zarr, который помещает каждый фрагмент в отдельный файл (подход, который в настоящее время, вероятно, будет принят в будущих версиях HDF).

person benjimin    schedule 07.02.2018

Если вы работаете в AWS, проверьте HDF Cloud: https://www.hdfgroup.org/solutions/hdf-cloud.

Это служба, которая обеспечивает несколько рабочих процессов чтения/записи и в значительной степени совместима с библиотекой HDF5. Клиентский SDK не поддерживает неблокирующую запись, но, конечно, если вы используете REST API напрямую, вы можете выполнять неблокирующий ввод-вывод так же, как и с любой службой на основе http.

person John Readey    schedule 07.02.2018