HDF5の同時実行の制限を理解しようとしています。
HDF5には、parallel HDF5とdefaultの2つのビルドがあります。パラレルバージョンは現在Ubuntuで提供されており、デフォルトはAnacondaで提供されています(--enable-parallel
国旗)。
同じファイルへの並列書き込みは不可能であることを知っています。ただし、デフォルトまたは並列ビルドで次のアクションがどの程度拡張可能かについては、完全には理解していません。
また、anacondaが--enable-parallelフラグをデフォルトでオンにしていない理由はありますか? ( https://github.com/conda/conda-recipes/blob/master/hdf5/build.sh )
AFAICT、libhdf5をビルドするには3つの方法があります。
conda
レシピのように)つまり、--enable-threadsafe
フラグと--enable-parallel
フラグは相互に排他的です(https://www.hdfgroup.org/hdf5-quest.html#p5thread
)。
1つまたは複数のファイルの同時読み取りの場合の答えは、スレッドセーフが必要であることです(https://www.hdfgroup.org/hdf5-quest.html#tsafe
):
同じプロセス内の複数のスレッドから1つ以上のHDF5ファイルへの同時アクセスは、HDF5ライブラリの非スレッドセーフビルドでは機能しません。ダウンロード可能なビルド済みのバイナリはスレッドセーフではありません。
ユーザーは、(1)単一のHDF5ファイル内の異なるデータセットへの同時アクセス、および(2)異なるHDF5ファイルへの同時アクセスの両方に、HDF5ライブラリのスレッドセーフバージョンが必要であることを知って驚くことがよくあります。 。これらの例の各スレッドは異なるデータにアクセスしていますが、HDF5ライブラリは、特定のHDF5データセットまたはHDF5ファイルから独立しているグローバルデータ構造を変更します。 HDF5は、スレッドセーフバージョンのライブラリのライブラリAPI呼び出しの周りのセマフォに依存して、異なるスレッドからの同時操作による破損からデータ構造を保護します。保護する必要があるHDF5ライブラリのグローバルデータ構造の例は、空き領域マネージャーと開いているファイルのリストです。
編集:HDFグループがWebサイトを再編成したため、上記のリンクは機能しなくなりました。 HDF5ナレッジベース に、便利な情報を含むページ "スレッドセーフと同時アクセスに関する質問" があります。
単一のプロセスの同時スレッドのみがパッセージで言及されていますが、フォークされたサブプロセスにも同様に適用されるようです。このh5py マルチプロセッシングの例 を参照してください。
parallelアクセスの場合、「Parallel HDF5」を使用することもできますが、これらの機能にはMPIを使用する必要があります。このパターンは h5py でサポートされていますが、複雑で難解であり、おそらくスレッドセーフモードよりも移植性が低くなります。さらに重要なことに、libhdf5の並列ビルドで単純に同時読み取りを実行すると、ライブラリがスレッドセーフではないため、予期しない結果が発生します。
効率に加えて、スレッドセーフビルドフラグの1つの制限は、Windowsサポートの欠如です(https://www.hdfgroup.org/hdf5-quest.html#gconc
):
HDF5のスレッドセーフバージョンは、現在、MS Windowsプラットフォームでテストまたはサポートされていません。ユーザーはWindows 64ビットでこれを機能させることができ、Windows 64ビットPthreadsパッチを提供しました。
Python)から(異なる!)ファイルを読み取るときに奇妙な破損した結果を取得することは、予想外であり、同時読み取りアクセスがHDF5の宣伝されている「機能」の1つであることを考えると不満であり、おそらくcondaのより良いデフォルトのレシピですそれをサポートするプラットフォームで--enable-threadsafe
をインクルードすることになりますが、プラットフォーム固有の動作になってしまうと思います。
追加するだけです:読み取りアクセスを行う独立した並行プロセス(つまりpython)は fine
HDF5 1.10は Single Writer Multiple Reader 、 more infos をサポートし、h5py 2.5.0は support をサポートします