2016-12-28 82 views
2

在我的代碼中,我使用mpi(mpi4py/h5py)在hdf5文件上並行保存多個處理過的圖像(numpy數組)。爲了做到這一點,需要使用driver=mpio選項打開文件。dask和並行hdf5寫作

import h5py 
from mpi4py import MPI 
file_hdl=h5py.File(file_lath,'r+',driver='mpio', comm=MPI.COMM_WORLD) 

我想離開mpi並使用dask進行並行化。是否可以在dask中使用並行hdf5?我還需要依靠mpi嗎?如果有,還有更好的方法來存儲數據嗎? 謝謝

回答

2

這是一個困難而複雜的問題。

通常HDF5針對並行MPI讀取和寫入進行了高度優化。在MPI之外很難獲得同樣的支持。

此外,這個問題很難,因爲人們使用Dask和HDF5的方式不同,有些在同一進程中使用多個線程(h5py不是線程安全),而另一些則在同一個硬盤上使用多個進程,系統。另外用戶通常使用幾個HDF5文件,例如每天有一個文件的數據。

Dask通常使用鎖來處理並行讀取和寫入HDF5。如果你在一個單獨的過程中,那麼這是一個正常的threading.Lock對象。通常,這不會影響性能,因爲從HDF5文件讀取通常是I/O而不是CPU綁定。有一些爭論,但沒什麼可擔心的。

在分佈式設置中,我們使用可序列化的鎖,它可以防止任何特定進程中的多線程併發訪問,但不會阻止兩個進程相互衝突。通常這不是問題,因爲只要不在同一個進程中,人們通常會編寫與HDF5塊對齊的連貫塊。

人們愉快地每天使用HDF5與Dask.array並行。但是,我並不相信萬事萬物都是萬無一失的。我懷疑有可能設計一個破案。

(同樣,這方面的問題正在迅速發展。這個答案可能會很快變得過時)

https://github.com/pydata/xarray/issues/798