16

複合要素の 1 次元 (N x 1) データセットを含む HDF5 ファイルを持っています。実際には時系列です。データは最初にオフラインで HFD5 ファイルに収集され、次に分析されます。分析中に、ほとんどのデータは興味深いものではないことが判明し、その一部だけが興味深いものになります。データセットは非常に大きくなる可能性があるため、興味深い要素を維持しながら、興味のない要素を取り除きたいと考えています。たとえば、500 要素のデータセットの要素 0 ~ 100 と 200 ~ 300、および 350 ~ 400 を保持し、残りをダンプします。しかし、どのように?

HDF5 でこれを達成する方法について経験のある人はいますか? どうやら、少なくとも次の方法で行うことができます。

  • (明らかな解決策)、新しい新鮮なファイルを作成し、そこに必要なデータを要素ごとに書き込みます。次に、古いファイルを削除します。
  • または、古いファイルに新しい新しいデータセットを作成し、そこに必要なデータを書き込み、H5Gunlink() を使用して古いデータセットのリンクを解除し、h5repack を介してファイルを実行して、要求されていない空き領域を取り除きます。
  • または、既存のデータセット内の関心のある要素を先頭に向かって移動します (たとえば、要素 200 ~ 300 を位置 101 ~ 201 に、要素 350 ~ 400 を位置 202 ~ 252 に移動します)。次に、H5Dset_extent() を呼び出して、データセットのサイズを縮小します。次に、h5repack を実行して空き領域を解放します。

つまらない要素を取り除いてもかなりファイルが大きくなる可能性があるので、書き直しはしたくない(時間がかかる)のですが、実際に空き容量を解放する必要がありそうです。HDF5 の専門家からのヒントはありますか?

4

2 に答える 2

9

HDF5 (少なくとも私が慣れ親しんでいるバージョン 1.6.9) では削除できません。実際には解放されますが、使用済みのスペースが解放されないため、まだ巨大なファイルが残っています。おっしゃるとおり、h5repack を使うこともできますが、時間とリソースの無駄です。

できることは、ブール値を含むラテラル データセットを用意して、どの値が「生きている」か、どの値が削除されたかを示すことです。これによりファイルが小さくなるわけではありませんが、少なくとも削除を実行するための高速な方法が得られます。

別の方法は、配列にスラブを定義し、関連するデータをコピーしてから古い配列を削除するか、常にスラブを介してデータにアクセスし、必要に応じて再定義することです (ただし、私はそれを行ったことがないので、可能かどうかはわかりませんが、そうすべきです)

最後に、hdf5 マウント戦略を使用して、ルート hdf5 にマウントする「添付」hdf5 ファイルにデータセットを含めることができます。ものを削除したい場合は、興味深いデータを別のマウントされたファイルにコピーし、古いファイルをアンマウントして削除し、新しいファイルを適切な場所に再マウントします。この解決策は面倒かもしれませんが (ファイルが複数あるため)、再パックを使用する代わりに、スペースを解放し、データ ツリーのサブパーツのみを操作することができます。

于 2009-07-14T13:55:15.227 に答える