2

HDF5 C++ API を使用しています。非常にまれに 64 kB を超える属性を書き込まなければならないプログラムがあります。このような大きな属性を書き込もうとすると、H5::AttributeIException がスローされます。

HDF5 のドキュメントには、大きな属性を格納する 2 つの方法が記載されています。最初のオプションは高密度ストレージ (バージョン 1.8.8 以降で利用可能だと思います) であり、2 番目のオプションは属性内のデータを追加のデータセットにオフロードし、そのデータセットへの参照を属性内に格納することです。この 2 番目のオプションは後方互換性があると想定されていますが、最初のオプションは 1.8.8 より前の HDF5 バージョンとの互換性を壊します。

残念ながら、これらのオプションのいずれかを C++ で実装する方法に関するドキュメントはないようです。C API と C++ API を組み合わせることで、最初のオプションをハックしようとしました。ここでの高密度ストレージの例に基づいた私の試みは次のとおりです。

hid_t dID = dataset->getId();
herr_t res = H5Pset_attr_phase_change(dID, 0, 0);
if(res < 0) {
    std::cerr << "Failed to specify dense storage." << std::endl;
}

ここで、dataset は H5::DataSet オブジェクトです。res が常に負であることで示されるように、このコードは高密度ストレージの設定に失敗します。これは、高密度ストレージの C の例で行われているように、H5F_LIBVER_LATEST のようなものを指定していないことが原因である可能性があると思います。

fpid = H5Pcreate (H5P_FILE_ACCESS);
status = H5Pset_libver_bounds (fpid, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST);
fid = H5Fcreate("adense.h5", H5F_ACC_TRUNC, H5P_DEFAULT, fpid);

C++ API で H5F_LIBVER_LATEST を指定する方法が見つかりません。H5::FileAccPropList クラスには、ドキュメントからわかる限り、set_libver_bounds に似たメンバー関数はありません。

補助データセットへの参照として属性を格納する 2 番目のオプションについては、C++ のドキュメントにこの例がないため、どこから始めればよいかわかりません。

高密度ストレージを実装する方法、または C++ でデータセットへの参照として属性を格納する方法を知っている人はいますか?

4

3 に答える 3