2009-07-14 16 views
14

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

HDF5でこれをどのように達成した経験がありますか? 、

  • (明白な解決策)新しい新鮮なファイルを作成し、そこに要素ごとに、必要なデータを書き込む:どうやらそれは、少なくとも、いくつかの方法で行うことができます。その後、古いファイルを削除します。
  • 古いファイルに新しい新しいデータセットを作成し、そこに必要なデータを書き込み、H5Gunlink()を使用して古いデータセットのリンクを解除し、h5repackでファイルを実行して未請求の空き領域を取り除きます。
  • または、既存のデータセット内の興味深い要素を開始点に向かって移動します(たとえば、要素200〜300を101〜201の位置に移動し、350〜400の要素を202〜252の位置に移動します)。次に、H5Dset_extent()を呼び出して、データセットのサイズを縮小します。次に、空き領域を解放するためにh5repackを実行してください。

興味のない要素が削除されてもファイルがかなり大きくなる可能性がありますので、書き直しはしません(時間がかかります)が、実際に空き領域を解放する必要があるようです。 HDF5の専門家からのヒント?

答えて

8

HDF5(少なくとも私が使用していたバージョン1.6.9)は削除を許可していません。実際には、それはありますが、使用されたスペースを解放するわけではありません。その結果、まだ大きなファイルが残っています。あなたが言ったように、あなたはh5repackを使うことができますが、それは時間とリソースの無駄です。

あなたができることは、どの値が "生きている"か、どの値が削除されたかを伝えるブール値を含む横方向のデータセットを持つことです。これはファイルを小さくしませんが、少なくとも削除を実行するための速い方法を提供します。

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

最後に、hdf5マウント戦略を使用して、あなたのルートhdf5にマウントした「接続された」hdf5ファイルにデータセットを持たせることができます。これらのファイルを削除するには、別のマウントされたファイルに興味のあるデータをコピーし、古いファイルをアンマウントして削除してから、適切な場所に新しいファイルをマウントし直します。このソリューションは、(あなたが複数のファイルを持っているので)乱雑になることがありますが、スペースを解放して、データツリーのサブパートでのみ動作することができます。

+0

あなたの考えをありがとう。それは実際に多くの方法で行うことができます。うまくいけば、本当に削除機能がいつかHDF5に追加されます。ちょうどこのようなものを削除するだけでほぼばかげています...しかし、そうでなければ、良いファイル形式です:-) –

+1

削除とパッキングは簡単ではありません。 HDF5はファイルシステムに似ています。ブロックを解放しても、それらを削除済みとしてマークしても、「ライブ」中にファイルをパッキングするのは難しく、パフォーマンスのボトルネックになります。あなたはMacOSX上の暗号化されたファイルシステムと同じ問題に直面しています。私の推測では、いつでもHDF5レベルであなたの問題に対する解決策は期待できません。 –

+0

確かに、HDF5開発者にとっては、それは簡単ではなく、おそらく第一の関心事ではないでしょう。しかし、それは確かに可能です - ほとんどのデータベースはそれを行うことができます、と私は思います。 –

1

あなたが説明したようにデータをコピーするか、h5repackを使用するのは、残念なことにHDF5ファイル内のデータを「縮める」2つの通常の方法です。

HDF5ファイルが複雑な内部構造(ファイルフォーマットがhere、好奇心を抱く人なら誰でも)が問題であるため、削除して縮小すると同じサイズの穴が残るだけですファイル。 HDF5ライブラリの最近のバージョンでは、空き領域を追跡して再利用することができますが、ユースケースではそれを利用できないようです。

もう1つの答えで言及したように、外部リンクまたは仮想データセット機能を使用して、操作の種類に適したHDF5ファイルを構築できる可能性がありますが、多くのデータをコピーする必要があり、複雑さとファイル管理のオーバーヘッドが増えます。

H5Gunlink()は廃止されました。 H5Ldelete()が優先されます。

関連する問題