在C语言中读取HDF5数据帧单列及H5Sselect_hyperslab使用问题
用C语言的HDF5库逐行加载数据(使用H5Sselect_hyperslab)
要实现逐行加载HDF5数据集,核心是通过H5Sselect_hyperslab每次选中数据集里的单独一行,下面是完整的实现步骤和代码示例:
核心逻辑
- 打开HDF5文件和目标数据集,获取数据集的空间标识。
- 查询数据集的维度信息,确定总行数以及每行的列数。
- 创建内存空间,用来存储单一行的数据。
- 循环遍历每一行:
- 每次调用
H5Sselect_hyperslab选中当前行 - 通过
H5Dread将选中的行读取到内存中 - 处理读取到的数据,然后进入下一次循环
- 每次调用
完整代码示例
#include <stdio.h> #include <hdf5.h> #define FILE_NAME "your_dataset.h5" #define DATASET_NAME "your_data" int main() { hid_t file_id, dataset_id, dataspace_id, memspace_id; hsize_t dims[2], start[2], count[2]; herr_t status; int *row_data; int num_rows, num_cols; // 打开HDF5文件 file_id = H5Fopen(FILE_NAME, H5F_ACC_RDONLY, H5P_DEFAULT); // 打开数据集 dataset_id = H5Dopen2(file_id, DATASET_NAME, H5P_DEFAULT); // 获取数据集的空间标识 dataspace_id = H5Dget_space(dataset_id); // 获取数据集的维度(这里假设是二维数据集,行x列) int ndims = H5Sget_simple_extent_dims(dataspace_id, dims, NULL); num_rows = dims[0]; num_cols = dims[1]; // 分配内存存储单行数据 row_data = (int *)malloc(num_cols * sizeof(int)); if (!row_data) { fprintf(stderr, "内存分配失败\n"); goto cleanup; } // 创建内存空间,对应单行的维度 dims[0] = 1; // 内存空间只存1行 memspace_id = H5Screate_simple(2, dims, NULL); // 设置每次读取的块大小:1行,所有列 count[0] = 1; count[1] = num_cols; // 逐行读取 for (int i = 0; i < num_rows; i++) { // 设置当前行的起始坐标:第i行,第0列 start[0] = i; start[1] = 0; // 选中数据集里的当前行 status = H5Sselect_hyperslab(dataspace_id, H5S_SELECT_SET, start, NULL, count, NULL); if (status < 0) { fprintf(stderr, "选择第%d行失败\n", i); break; } // 读取当前行到内存 status = H5Dread(dataset_id, H5T_NATIVE_INT, memspace_id, dataspace_id, H5P_DEFAULT, row_data); if (status < 0) { fprintf(stderr, "读取第%d行失败\n", i); break; } // 这里可以添加处理单行数据的逻辑,比如打印 printf("第%d行数据:", i); for (int j = 0; j < num_cols; j++) { printf("%d ", row_data[j]); } printf("\n"); } cleanup: // 释放资源 if (row_data) free(row_data); H5Sclose(memspace_id); H5Sclose(dataspace_id); H5Dclose(dataset_id); H5Fclose(file_id); return 0; }
关键函数解释:H5Sselect_hyperslab
函数原型:
herr_t H5Sselect_hyperslab(hid_t space_id, H5S_seloper_t op, const hsize_t *start, const hsize_t *stride, const hsize_t *count, const hsize_t *block)
space_id:要操作的数据集空间标识op:选择操作模式,这里用H5S_SELECT_SET表示每次重置选择范围,只选中当前行start:选中区域的起始坐标,start[0]是行索引,start[1]是列索引(二维情况)stride:步长,设为NULL表示默认连续取值count:选中区域的维度大小,这里count[0]=1表示选1行,count[1]=num_cols表示选所有列block:块的大小,设为NULL表示和count一致
注意事项
- 如果你的数据集是一维的,只需要调整维度相关的代码,把
dims改成一维数组即可 - 要根据数据集的实际数据类型修改
H5T_NATIVE_INT,比如浮点型用H5T_NATIVE_FLOAT - 确保编译时链接HDF5库,比如用
gcc your_code.c -o your_code -lhdf5
内容的提问来源于stack exchange,提问作者bartolus
相关产品推荐
相关产品推荐

