8

多数の小さなデータセットを HDF5 ファイルに書き込んでいます。結果のファイルサイズは、入力しているデータの単純な表から予想されるサイズの約 10 倍になります。データは次のように階層的に編成されています。

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 バイトを占める必要があります。データと一緒に属性を保存しません。それでも、テストでは、各サブグループが約 4 kB、つまり予想の約 2 倍を占めることがわかりました。多少のオーバーヘッドがあることは理解していますが、それはどこから来ているのでしょうか?どうすれば削減できますか? それはグループ構造を表すことにあるのでしょうか。

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

4

1 に答える 1

6

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

各サブグループの 2 つのデータセットを (100 x 5) データセットに結合することで、この問題を解決しました。次に、サブグループを削除し、各グループのすべてのデータセットを 3D データセットに結合しました。したがって、以前に N 個のサブグループがあった場合、各グループに 1 つのデータセットがあり、形状 (N x 100 x 5) があります。したがって、以前存在していた N * 2.2 kB のオーバーヘッドを節約できます。さらに、HDF5 の組み込み圧縮は配列が大きいほど効果的であるため、以前はオーバーヘッドがファイルの半分のスペースを占有し、圧縮はまったく効果がなかったのに対し、全体の圧縮率は 1:1 よりも良くなりました。

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

于 2013-03-08T03:05:28.763 に答える