2013-01-15 9 views
6

私はHDF5ファイルに多数の小さなデータセットを書きます。その結果のファイルサイズは、入れているデータの素朴な表から予想されるものの約10倍です。私のデータは階層的に編成されていますHDF5ストレージオーバーヘッド

group 0 
    -> subgroup 0 
     -> dataset (dimensions: 100 x 4, datatype: float) 
     -> dataset (dimensions: 100, datatype: float) 
    -> subgroup 1 
     -> dataset (dimensions: 100 x 4, datatype: float) 
     -> dataset (dimensions: 100, datatype: float) 
    ... 
group 1 
... 

各サブグループは、オーバーヘッドを無視して500×4バイト= 2000バイトを占める必要があります。私はデータと一緒に何かの属性を保存しません。しかし、テストでは、各サブグループが約4kB、つまり私が期待する約2倍を占めることがわかりました。私はいくつかのオーバーヘッドがあることを理解していますが、どこから来ていますか、どのように減らすことができますか?それはグループの構造を表すことにありますか?

詳細情報: 各サブグループの2つのデータセットのサイズを1000 x 4および1000に増やした場合、各サブグループは予想通りの20,000バイトではなく、約22,250バイトを占めます。これは、サブグループごとに2.2 kBのオーバーヘッドを意味し、より小さいデータセットサイズで得られた結果と一致しています。このオーバーヘッドを減らす方法はありますか?

+3

HDF5ファイル形式は[非常に複雑です](http://www.hdfgroup.org/HDF5/doc/H5.format.html)です。内部ブロッキングを使用してデータおよびメタデータ・オブジェクトを格納します。メタデータのデフォルトのブロックサイズは2 KiBで、各(サブ)グループには独自のヘッダースペースがあり、これは約2000バイトの差異を説明しています。ストレージ戦略の詳細については、(4.5)[here](http://www.hdfgroup.org/HDF5/doc1.6/UG/10_Datasets.html)を参照してください。 –

+2

私が上記で与えた数字は、 'COMPACT'がセットされています。これからの教訓は、少量のデータを格納する複雑なグループ構造を回避することです。すべてのデータセットをより大きな配列に結合して圧縮を適用した後は、1:1のパッキング比より優れています(圧縮ではHDF5のオーバーヘッドよりも多くの領域が節約されます)。 – Thucydides411

+0

@ Thucydides411あなたのコメントは最善の答えです!あなたはそれを答えに書いてそれを受け入れるべきです。 – Simon

答えて

4

私は自分の質問に答えます。グループ構造を表すだけのオーバヘッドで十分です。小さな配列を格納することや、少量のデータしか格納しないグループを多数持つことは意味がありません。グループあたりのオーバーヘッドを減らす方法はないようで、約2.2 kBで測定しました。

この問題は、各サブグループの2つのデータセットを組み合わせて(100 x 5)データセットにすることで解決しました。次に、サブグループを削除し、各グループのすべてのデータセットを3Dデータセットに結合しました。したがって、以前にN個のサブグループがあった場合、それぞれのグループに1つのデータセットがあり、形状(N×100×5)になりました。したがって、以前に存在していたN * 2.2 kBのオーバーヘッドを節約することができます。さらに、HDF5のビルトイン圧縮はより大きなアレイでより効果的であるため、以前はオーバーヘッドがファイルの半分を占め、圧縮は完全に無効でしたが、全体のパッチング比は1:1より優れています。

教訓は、HDF5ファイルの複雑なグループ構造を避け、可能な限り多くのデータを各データセットに結合しようとすることです。

+1

はい...いいえ。 HDF5は、大規模なデータセットを保存するために科学者によって作成されました。私は2Kbを超えることに執着することがそのポイントを逃すことだと思う。スペースが限られている場合は、おそらくこれは間違ったライブラリです。可能な限り自己記述的なデータを作成しようとすると、たとえそれが数KBで済むとしても、常に価値があります。 「巧妙な」コードを書くことができるのと同じように、「巧妙な」データ構造を構築できますが、ムーアの法則は、メンテナンス可能なコードと自己記述データ構造を書く人々の側にあります。 –

+0

私は私の答えでこれを乗り越えたと思う。多数の小さなデータセットを格納する場合、データセットあたり2kBが問題になります。私の答えは、可能であれば、より大きなデータセットにデータをパックすることです。私は複雑な構造を提案しませんでした。各軸が意味を持つ3Dデータセットは非常に簡単です。 – Thucydides411