web-dev-qa-db-ja.com

HDF5は、同時読み取り、または異なるファイルへの書き込みをサポートしていますか?

HDF5の同時実行の制限を理解しようとしています。

HDF5には、parallel HDF5defaultの2つのビルドがあります。パラレルバージョンは現在Ubuntuで提供されており、デフォルトはAnacondaで提供されています(--enable-parallel 国旗)。

同じファイルへの並列書き込みは不可能であることを知っています。ただし、デフォルトまたは並列ビルドで次のアクションがどの程度拡張可能かについては、完全には理解していません。

  • 同じファイルから読み取る複数のプロセス
  • 異なるファイルから読み取るいくつかのプロセス
  • いくつかのプロセスが異なるファイルに書き込みます。

また、anacondaが--enable-parallelフラグをデフォルトでオンにしていない理由はありますか? ( https://github.com/conda/conda-recipes/blob/master/hdf5/build.sh

20
Maxim Imakaev

AFAICT、libhdf5をビルドするには3つの方法があります。

  • スレッドセーフでも、MPIサポートなしでも(投稿したcondaレシピのように)
  • MPIサポートあり、ただしスレッドセーフなし
  • スレッドセーフで、MPIサポートなし

つまり、--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をインクルードすることになりますが、プラットフォーム固有の動作になってしまうと思います。

16
nvictus

追加するだけです:読み取りアクセスを行う独立した並行プロセス(つまりpython)は fine

HDF5 1.10は Single Writer Multiple Readermore infos をサポートし、h5py 2.5.0は support をサポートします

4
Ümit