HDF5文件格式:数据类型与读写功能详解

news2025/4/15 6:07:49

HDF5文件格式:数据类型与读写功能详解

HDF5简介

HDF5(Hierarchical Data Format version 5)是一种用于存储和管理大量科学数据的文件格式和库。它由美国国家高级计算应用中心(NCSA)开发,具有以下特点:

  • 分层结构(类似文件系统中的目录结构)
  • 支持多种数据类型
  • 跨平台兼容
  • 支持并行I/O
  • 提供数据压缩和分块存储

HDF5数据类型

HDF5支持丰富的数据类型,主要分为两类:

1. 基本数据类型

  • 整数类型:H5T_STD_I8, H5T_STD_I16, H5T_STD_I32, H5T_STD_I64(有符号)
  • 无符号整数:H5T_STD_U8, H5T_STD_U16, H5T_STD_U32, H5T_STD_U64
  • 浮点类型:H5T_IEEE_F32, H5T_IEEE_F64
  • 字符串类型:定长或变长字符串
  • 复合类型:类似C语言中的结构体
  • 枚举类型
  • 数组类型
  • 变长数据类型

2. 派生数据类型

用户可以根据需要创建更复杂的数据类型:

  • 复合类型(结构体)
  • 数组类型
  • 枚举类型
  • 变长类型
  • 不透明类型

HDF5读写功能

HDF5库提供的主要功能包括:

  1. 文件操作:创建、打开、关闭文件
  2. 组操作:创建、遍历组(类似目录)
  3. 数据集操作:创建、读写数据集(类似多维数组)
  4. 属性操作:为组或数据集添加元数据
  5. 数据类型操作:创建和管理数据类型
  6. 存储管理:分块、压缩、分片存储

HDF5读写示例程序(C语言)

示例1:创建HDF5文件并写入数据集

#include <hdf5.h>
#include <stdio.h>

#define FILE_NAME "example.h5"
#define DATASET_NAME "IntArray"
#define DIM0 4
#define DIM1 6

int main() {
    hid_t file_id, dataset_id, dataspace_id;
    herr_t status;
    hsize_t dims[2] = {DIM0, DIM1};
    int data[DIM0][DIM1];
    
    // 初始化数据
    for (int i = 0; i < DIM0; i++)
        for (int j = 0; j < DIM1; j++)
            data[i][j] = i * DIM1 + j + 1;
    
    // 创建新HDF5文件
    file_id = H5Fcreate(FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
    
    // 创建数据空间
    dataspace_id = H5Screate_simple(2, dims, NULL);
    
    // 创建数据集
    dataset_id = H5Dcreate2(file_id, DATASET_NAME, H5T_STD_I32LE, dataspace_id, 
                          H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
    
    // 写入数据
    status = H5Dwrite(dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);
    
    // 关闭资源
    status = H5Dclose(dataset_id);
    status = H5Sclose(dataspace_id);
    status = H5Fclose(file_id);
    
    printf("HDF5文件创建成功,数据已写入。\n");
    return 0;
}

示例2:读取HDF5文件中的数据

#include <hdf5.h>
#include <stdio.h>

#define FILE_NAME "example.h5"
#define DATASET_NAME "IntArray"
#define DIM0 4
#define DIM1 6

int main() {
    hid_t file_id, dataset_id;
    herr_t status;
    int data[DIM0][DIM1];
    
    // 打开现有HDF5文件
    file_id = H5Fopen(FILE_NAME, H5F_ACC_RDONLY, H5P_DEFAULT);
    
    // 打开数据集
    dataset_id = H5Dopen2(file_id, DATASET_NAME, H5P_DEFAULT);
    
    // 读取数据
    status = H5Dread(dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);
    
    // 打印数据
    printf("读取的数据内容:\n");
    for (int i = 0; i < DIM0; i++) {
        for (int j = 0; j < DIM1; j++)
            printf("%3d ", data[i][j]);
        printf("\n");
    }
    
    // 关闭资源
    status = H5Dclose(dataset_id);
    status = H5Fclose(file_id);
    
    return 0;
}

示例3:使用压缩存储和属性

#include <hdf5.h>
#include <stdio.h>
#include <time.h>

#define FILE_NAME "compressed.h5"
#define DATASET_NAME "CompressedData"
#define DIM0 1000
#define DIM1 500

int main() {
    hid_t file_id, dataset_id, dataspace_id, plist_id, attr_id, atype_id;
    herr_t status;
    hsize_t dims[2] = {DIM0, DIM1};
    hsize_t chunk_dims[2] = {100, 100};
    float data[DIM0][DIM1];
    time_t current_time;
    char time_str[50];
    
    // 初始化数据
    for (int i = 0; i < DIM0; i++)
        for (int j = 0; j < DIM1; j++)
            data[i][j] = (float)(i + j) / (i + j + 1);
    
    // 创建新HDF5文件
    file_id = H5Fcreate(FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
    
    // 创建数据空间
    dataspace_id = H5Screate_simple(2, dims, NULL);
    
    // 创建数据集创建属性列表,启用压缩和分块
    plist_id = H5Pcreate(H5P_DATASET_CREATE);
    status = H5Pset_chunk(plist_id, 2, chunk_dims);
    status = H5Pset_deflate(plist_id, 6);  // 设置压缩级别
    
    // 创建数据集
    dataset_id = H5Dcreate2(file_id, DATASET_NAME, H5T_IEEE_F32LE, dataspace_id, 
                          H5P_DEFAULT, plist_id, H5P_DEFAULT);
    
    // 写入数据
    status = H5Dwrite(dataset_id, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);
    
    // 添加创建时间属性
    current_time = time(NULL);
    strftime(time_str, sizeof(time_str), "%Y-%m-%d %H:%M:%S", localtime(&current_time));
    
    atype_id = H5Tcopy(H5T_C_S1);
    status = H5Tset_size(atype_id, strlen(time_str) + 1);
    attr_id = H5Acreate2(dataset_id, "CreationTime", atype_id, 
                        H5Screate(H5S_SCALAR), H5P_DEFAULT, H5P_DEFAULT);
    status = H5Awrite(attr_id, atype_id, time_str);
    
    // 关闭资源
    status = H5Aclose(attr_id);
    status = H5Tclose(atype_id);
    status = H5Pclose(plist_id);
    status = H5Dclose(dataset_id);
    status = H5Sclose(dataspace_id);
    status = H5Fclose(file_id);
    
    printf("压缩的HDF5文件创建成功,数据已写入。\n");
    return 0;
}

其他语言绑定

HDF5不仅支持C语言,还提供多种语言的API:

  • Python:h5py或PyTables库
  • C++:HDF5 C++ API
  • Java:HDF5 Java绑定
  • MATLAB:HDF5接口
  • R:rhdf5包

Python示例(使用h5py)

import h5py
import numpy as np

# 创建文件并写入数据
with h5py.File('example_py.h5', 'w') as f:
    data = np.arange(100).reshape(20, 5)
    dset = f.create_dataset("mydata", data=data)
    dset.attrs['description'] = "Example dataset created with Python"

# 读取数据
with h5py.File('example_py.h5', 'r') as f:
    data_read = f['mydata'][:]
    print("Data shape:", data_read.shape)
    print("Description:", f['mydata'].attrs['description'])

总结

HDF5是一种强大的科学数据存储格式,具有以下优势:

  1. 支持大型复杂数据集
  2. 高效的分块和压缩存储
  3. 丰富的元数据支持(属性)
  4. 跨平台兼容性
  5. 多种编程语言支持

通过合理使用HDF5,可以有效地组织、存储和访问大规模科学数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2334132.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

macOS Chrome - 打开开发者工具,设置 Local storage

文章目录 macOS Chrome - 打开开发者工具设置 Local storage macOS Chrome - 打开开发者工具 方式2&#xff1a;右键点击网页&#xff0c;选择 检查 设置 Local storage 选择要设置的 url&#xff0c;显示右侧面板 双击面板&#xff0c;输入要添加的内容 2025-04-08&#xff…

kubernetes 入门篇之架构介绍

经过前段时间的学习和实践&#xff0c;对k8s的架构有了一个大致的理解。 1. k8s 分层架构 架构层级核心组件控制平面层etcd、API Server、Scheduler、Controller Manager工作节点层Kubelet、Kube-proxy、CRI&#xff08;容器运行时接口&#xff09;、CNI&#xff08;网络插件&…

如何使用通义灵码完成PHP单元测试 - AI辅助开发教程

一、引言 在软件开发过程中&#xff0c;测试是至关重要的一环。然而&#xff0c;在传统开发中&#xff0c;测试常常被忽略或草草处理&#xff0c;很多时候并非开发人员故意为之&#xff0c;而是缺乏相应的测试思路和方法&#xff0c;不知道如何设计测试用例。随着 AI 技术的飞…

pig 权限管理开源项目学习

pig 源码 https://github.com/pig-mesh/pig 文档在其中&#xff0c;前端在文档中&#xff0c;官方视频教学也在文档中有。 第一次搭建&#xff0c;建议直接去看单体视频&#xff0c;照着做即可&#xff0c;需 mysql&#xff0c;redis 基础。 文章目录 项目结构Maven 多模块项…

探秘Transformer系列之(26)--- KV Cache优化 之 PD分离or合并

探秘Transformer系列之&#xff08;26&#xff09;— KV Cache优化 之 PD分离or合并 文章目录 探秘Transformer系列之&#xff08;26&#xff09;--- KV Cache优化 之 PD分离or合并0x00 概述0x01 背景知识1.1 自回归&迭代1.2 KV Cache 0x02 静态批处理2.1 调度策略2.2 问题…

C++语言程序设计——02 变量与数据类型

目录 一、变量与数据类型&#xff08;一&#xff09;变量的数据类型&#xff08;二&#xff09;变量命名规则&#xff08;三&#xff09;定义变量&#xff08;四&#xff09;变量赋值&#xff08;五&#xff09;查看数据类型 二、ASCII码三、进制表示与转换&#xff08;一&…

Model Context Protocol (MCP) - 尝试创建和测试一下MCP Server

1.简单介绍 MCP是Model Context Protocol的缩写&#xff0c;是Anthropic开源的一个标准协议。MCP使得大语言模型可以和外部的数据源&#xff0c;工具进行集成。当前MCP在社区逐渐地流行起来了。同时official C# SDK(仓库是csharp-sdk) 也在不断更新中&#xff0c;目前最新版本…

python文件打包无法导入ultralytics模块

&#x1f4a5;打包的 .exe 闪退了&#xff1f;别慌&#xff01;教你逐步排查 PyInstaller 打包的所有错误&#xff01; &#x1f6e0; 运行 .exe 查看报错信息✅ 正确姿势&#xff1a; ⚠ importlib 动态导入导致打包失败❓什么是动态导入&#xff1f;✅ 解决方式&#xff1a; …

AMBA-CHI协议详解(二十六)

AMBA-CHI协议详解(一)- Introduction AMBA-CHI协议详解(二)- Channel fields / Read transactions AMBA-CHI协议详解(三)- Write transactions AMBA-CHI协议详解(四)- Other transactions AMBA-CHI协议详解(五)- Transaction identifier fields AMBA-CHI协议详解(六…

Go小技巧易错点100例(二十六)

本期分享&#xff1a; 1. string转[]byte是否会发生内存拷贝 2. Go程序获取文件的哈希值 正文&#xff1a; string转[]byte是否会发生内存拷贝 在Go语言中&#xff0c;字符串转换为字节数组&#xff08;[]byte&#xff09;确实会发生内存拷贝。这是因为在Go中&#xff0c;字…

FPGA_BD Block Design学习(一)

PS端开发流程详细步骤 1.第一步&#xff1a;打开Vivado软件&#xff0c;创建或打开一个工程。 2.第二步&#xff1a;在Block Design中添加arm核心&#xff0c;并将其配置为IP核。 3.第三步&#xff1a;配置arm核心的外设信息&#xff0c;如DDR接口、时钟频率、UART接口等。 …

ubuntu20.04+qt5.12.8安装serialbus

先从官网https://download.qt.io/archive/qt/5.12/5.12.8/submodules/ 下载 qtserialbus-everywhere-src-5.12.8.tar.xz 有需要其他版本的点击返回上一级自行寻找对应版本。 也可从 https://download.csdn.net/download/zhouhui1982/90595810 下载 在终端中依次输入以下命令…

如何查看自己抖音的IP属地?详细教程+常见问题解答

在当今互联网时代&#xff0c;IP属地信息已成为各大社交平台&#xff08;如抖音、微博、快手等&#xff09;展示用户真实网络位置的重要功能。无论是出于隐私保护、账号安全&#xff0c;还是单纯好奇自己的IP归属地&#xff0c;了解如何查看抖音IP属地都很有必要。 本文将详细介…

⑪数据中心网络M-LAG实战

一、DeviceA-M-LAG-Mater配置 1、M-LAG 系统配置。 # m-lag mad exclude interface GigabitEthernet1/0/7 m-lag mad exclude interface Vlan-interface100 m-lag mad exclude interface Vlan-interface101 m-lag system-mac 0002-0002-0002 m-lag system-number 1 m-la…

化工企业数字化转型:从数据贯通到生态重构的实践路径

一、战略定位&#xff1a;破解行业核心痛点 化工行业面临生产安全风险高&#xff08;全国危化品企业事故率年增5%&#xff09;、能耗与排放压力大&#xff08;占工业总能耗12%&#xff09;、供应链协同低效&#xff08;库存周转率低于制造业均值30%&#xff09;三大挑战。《石…

JAVA——初识JAVA

文章目录 如何在cmd上编译、运行代码解析String[] args中放的是什么Java结构编译运行可能遇到的错误Java中的注释Java的三种注释编码不一致的问题 IDEA常用基础开发快捷键补齐快捷键注释快捷键 IDEA的基础调式方法标识符 如何在cmd上编译、运行 在没有集成开发环境下&#xff…

Shell脚本的学习

编写脚本文件 定义以开头&#xff1a;#!/bin/bash #!用来声明脚本由什么shell解释&#xff0c;否则使用默认shel 第一步&#xff1a;编写脚本文件 #!/bin/bash #注释 echo "这是输出" 第二步&#xff1a;加上执行权限&#xff1a;chmod x 脚本文件名.sh 第三步&…

专题十四:动态路由——OSPF

一、OSPF简介 开放式最短路径优先OSPF&#xff08;Open Shortest Path First&#xff09;是IETF组织开发的一个基于链路状态的内部网关协议&#xff08;Interior Gateway Protocol&#xff09;&#xff0c;采用DIjkstra算法&#xff0c;协议号是89。用于自治系统&#xff08;A…

Cocos Creator Shader入门实战(八):Shader实现圆形、椭圆、菱形等头像

引擎&#xff1a;3.8.5 您好&#xff0c;我是鹤九日&#xff01; 回顾 Shader的学习是一条漫长的道路。 理论知识的枯燥无味&#xff0c;让很多人选择了放弃。然而不得不说&#xff1a;任何新知识、新领域的学习&#xff0c;本身面临的都是问题&#xff01; 互联网和AI给了我…

【AI论文】VCR-Bench:视频链式思考推理的综合评估框架

摘要&#xff1a;思想链&#xff08;CoT&#xff09;推理的进步显著增强了大型语言模型&#xff08;LLMs&#xff09;和大型视觉语言模型&#xff08;LVLMs&#xff09;的能力。 然而&#xff0c;目前仍然缺乏一个严格的视频CoT推理评估框架。 目前的视频基准测试无法充分评估推…