Не тривиально, но есть различные потенциальные обходные пути.
Обычная библиотека HDF5, по-видимому, даже не поддерживает одновременное чтение разных файлов несколькими потоками. Следовательно, NetCDF4 и привязки Python для них не будут поддерживать параллельную запись.
Если выходной файл предварительно инициализирован и в нем отключены фрагментация и сжатие, чтобы избежать индекса фрагмента, то (в принципе) могут работать одновременные неперекрывающиеся записи в один и тот же файл отдельными процессами (?).
В более поздних версиях HDF5 должна быть поддержка виртуальных наборов данных. Каждый процесс будет записывать выходные данные в другой файл, а затем будет создан новый файл-контейнер, состоящий из ссылок на отдельные файлы данных (но в остальном его можно будет читать как обычный файл HDF5).
Существует библиотека "Parallel HDF5" для MPI. Хотя в противном случае MPI может показаться излишним, у него есть преимущества при масштабировании позже на несколько машин.
Если запись вывода не является узким местом производительности, многопоточное приложение, вероятно, могло бы реализовать один поток вывода (используя некоторую форму структуры данных очереди).
[Изменить:] Другой вариант — использовать вместо этого формат zarr, который помещает каждый фрагмент в отдельный файл (подход, который в настоящее время, вероятно, будет принят в будущих версиях HDF).
person
benjimin
schedule
07.02.2018