添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

HDF5介绍

HDF 是用于存储和分发科学数据的一种自我描述、多对象文件格式。HDF 是由美国国家超级计算应用中心(NCSA)创建的,以满足不同群体的科学家在不同工程项目领域之需要。HDF 可以表示出科学数据存储和分布的许多必要条件。HDF 被设计为:

  • 自述性:对于一个HDF 文件里的每一个数据对象,有关于该数据的综合信息(元数据)。在没有任何外部信息的情况下,HDF 允许应用程序解释HDF文件的结构和内容。
  • 通用性:许多数据类型都可以被嵌入在一个HDF文件里。例如,通过使用合适的HDF 数据结构,符号、数字和图形数据可以同时存储在一个HDF 文件里。
  • 灵活性:HDF允许用户把相关的数据对象组合在一起,放到一个分层结构中,向数据对象添加描述和标签。它还允许用户把科学数据放到多个HDF 文件里。
  • 扩展性:HDF极易容纳将来新增加的数据模式,容易与其他标准格式兼容。
  • 跨平台性:HDF 是一个与平台无关的文件格式。HDF 文件无需任何转换就可以在不同平台上使用。
  • (官方介绍: https://support.hdfgroup.org/HDF5/whatishdf5.html)

    HDF5 结构

    HDF5 文件一般以 .h5 或者 .hdf5 作为后缀名,需要专门的软件才能打开预览文件的内容。

    HDF5 文件结构中有 2 primary objects : Groups Datasets

  • Groups 就类似于文件夹,每个 HDF5 文件其实就是根目录 **(root) group’/‘**。
  • Datasets 类似于 NumPy 中的数组 array 。
  • 每个 dataset 可以分成两部分: 原始数据 (raw) data values 元数据 metadata (a set of data that describes and gives information about other data => raw data)。

    +-- Dataset
    |   +-- (Raw) Data Values (eg: a 4 x 5 x 6 matrix)
    |   +-- Metadata
    |   |   +-- Dataspace (eg: Rank = 3, Dimensions = {4, 5, 6})
    |   |   +-- Datatype (eg: Integer)
    |   |   +-- Properties (eg: Chuncked, Compressed)
    |   |   +-- Attributes (eg: attr1 = 32.4, attr2 = "hello", ...)
    

    从上面的结构中可以看出:

  • Dataspace 给出原始数据的秩 (Rank) 和维度 (dimension)
  • Datatype 给出数据类型
  • Properties 说明该 dataset 的分块储存以及压缩情况
  • Chunked: Better access time for subsets; extendible
  • Chunked & Compressed: Improves storage efficiency, transmission speed
  • Attributes 为该 dataset 的其他自定义属性
  • 整个HDF5文件的结构如下所示:

    +-- /
    |   +-- group_1
    |   |   +-- dataset_1_1
    |   |   |   +-- attribute_1_1_1
    |   |   |   +-- attribute_1_1_2
    |   |   |   +-- ...
    |   |   |
    |   |   +-- dataset_1_2
    |   |   |   +-- attribute_1_2_1
    |   |   |   +-- attribute_1_2_2
    |   |   |   +-- ...
    |   |   |
    |   |   +-- ...
    |   |
    |   +-- group_2
    |   |   +-- dataset_2_1
    |   |   |   +-- attribute_2_1_1
    |   |   |   +-- attribute_2_1_2
    |   |   |   +-- ...
    |   |   |
    |   |   +-- dataset_2_2
    |   |   |   +-- attribute_2_2_1
    |   |   |   +-- attribute_2_2_2
    |   |   |   +-- ...
    |   |   |
    |   |   +-- ...
    |   |
    |   +-- ...
    

    Python 读写 HDF5 文件

    HDF5的python库h5py调用:

    import h5py
    import numpy as np
    # 保存数据为 HDF5 文件
    with h5py.File('../out/compressed_data.h5', 'w') as f:
         # 创建一个数据集,并使用 gzip 压缩
        dset = f.create_dataset('data', data=data, compression='gzip', compression_opts=9)
        # 打印数据
        print(data)
    

    c# 读取 HDF5 文件

    https://apollo3zehn.github.io/PureHDF/reading/index.html

    using System;
    using PureHDF;
    class Program
        static void Main(string[] args)
            // 打开 HDF5 文件
            using (var file = Hdf5.OpenFile("compressed_data.h5"))
                // 打开数据集
                using (var dataset = file.OpenDataset("data"))
                    // 获取数据集的维度
                    var dims = dataset.Dimensions;
                    Console.WriteLine($"Data shape: ({string.Join(", ", dims)})");
                    // 读取数据
                    float[,,,] data = new float[dims[0], dims[1], dims[2], dims[3]];
                    dataset.Read(data);
                    // 使用数据...
                    // 例如,打印第一个元素
                    Console.WriteLine($"First element: {data[0, 0, 0, 0]}");