HDF5 ファイル内のデータセットに関連付けられたデータをプログラムで変更したいと考えています。データセットを名前で削除する (変更されたデータで再度追加できるようにする) か、データセットを名前で更新する方法が見つからないようです。私は HDF5 1.6.x に C API を使用していますが、任意の HDF5 API へのポインターが役立ちます。
2 に答える
現時点では、HDF5は、ファイルからデータセットを削除したり、削除されたオブジェクトが占有していたストレージスペースを再利用したりするための簡単なメカニズムを提供していません。
したがって、単純な削除は問題外のようです。しかし、セクションは続きます:
H5Ldelete
データセットの削除と使用したスペースの再利用は、関数とh5repack
ユーティリティプログラムを使用して実行できます。このH5Ldelete
関数を使用すると、データセットへのリンクをファイル構造から削除できます。すべてのリンクが削除されると、データセットはどのアプリケーションからもアクセスできなくなり、ファイルから効果的に削除されます。リンクされていないデータセットが占めるスペースを回復する方法は、ファイルのすべてのオブジェクトを新しいファイルに書き込むことです。リンクされていないオブジェクトはアプリケーションにアクセスできず、新しいファイルに含まれません。h5repack
新しいファイルへのオブジェクトの書き込みは、カスタムプログラムまたはユーティリティプログラムを使用して実行できます。
C++ でデータセットを削除する場合は、次のコマンドが必要です。
H5File m_h5File (pathAndNameToHDF5File, H5F_ACC_RDWR); //The hdf5 c++ object.
std::string channelName = "/myGroup/myDataset";
int result = H5Ldelete(m_h5File.getId(), channelName.data(), H5P_DEFAULT);
成功した場合、結果は負でない値になります。それ以外の場合は負の値を返します。https://support.hdfgroup.org/HDF5/doc/RM/RM_H5L.html#Link-Delete
@MaxLybbert が言ったように、ハードディスクの空き容量は回復されません。再梱包ツールを使用する必要があります。ただし、HDF5 v.1.10 では、スペースを回復できます。しかし、ユーザー ガイドはまだ準備ができていません: https://support.hdfgroup.org/HDF5/docNewFeatures/NewFeaturesFileSpaceMgmtDocs.html