首先,请原谅我非常基本的问题:我正在学习教程,并且已经成功地编写了我的第一个HDF5数据集。现在,我要搬到地板房去,但我发现这样做很困难。
据我所知,我需要获得一个有效的内存空间,选择一个块,然后编写我的数据。但显然我做错了什么,因为我犯了错误:
HDF5-DIAG: Error detected in HDF5 (1.8.14) thread 0:
#000: H5Dio.c line 271 in H5Dwrite(): can't prepare for writing data
major: Dataset
minor: Write failed
#001: H5Dio.c line 352 in H5D__pre_write(): can't write data
major: Dataset
minor: Write failed
#002: H5Dio.c line 690 in H5D__write(): src and dest data spaces have different sizes
major: Invalid arguments to routine
minor: Bad value显然,我试图用错误的维度来编写数据,但我不知道如何纠正。我的目标是创建一个20x3矩阵,并将第二行设置为{ 10, 20, 30 }。
0 0 0
10 20 30
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0你能帮我理解这个问题吗?我的车密码在下面!
谢谢!
#include "hdf5.h"
#define FILE "dset.h5"
#define DSET "/dset"
int main() {
hid_t file_id, dataset_id, dataspace_id, filespace, memspace;
hsize_t dims[2], offset[2], count[2];
herr_t status;
unsigned int dset_data[3] = { 10, 20, 30 };
/* Create a new file using default properties. */
file_id = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
/* Create the data space for the dataset. */
dims[0] = 20; /* ROWS */
dims[1] = 3; /* COLS */
dataspace_id = H5Screate_simple(2, dims, NULL);
/* Create the dataset. */
dataset_id = H5Dcreate2(file_id, DSET, H5T_STD_I32BE, dataspace_id,
H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
/* Get the memory space */
memspace = H5Dget_space (dataset_id);
offset[0] = 1; /* ROWS */
offset[1] = 0; /* COLS */
count[0] = 1; /* ROWS */
count[1] = 3; /* COLS */
/* Select the slab */
status = H5Sselect_hyperslab(memspace, H5S_SELECT_SET,
offset, NULL, count, NULL);
/* Write the dataset. */
status = H5Dwrite(dataset_id, H5T_NATIVE_INT,
memspace, H5S_ALL, H5P_DEFAULT,
dset_data);
/* End access to the dataset and release resources used by it. */
status = H5Dclose(dataset_id);
/* Terminate access to the data space. */
status = H5Sclose(dataspace_id);
/* Close the file. */
status = H5Fclose(file_id);
} 发布于 2015-02-10 21:43:56
您的数据在内存中是连续的(memspace),但它是文件空间(dataspace_id)中的一个超级实验室。因此,您需要在dataset_id上进行选择,而不是在memspace上。
您需要调整memspace的大小,以容纳足够的行空间。在这里,我将创建一个由3个元素组成的简单的一维数据空间。就像这样,超级实验室的大小(3个元素)和内存中的大小将匹配。
发布于 2021-10-20 14:21:45
FWIW,调整原始源代码并保留原来的"memspace = H5Dget_space (Dataset_id)“,在原样中,我让它在Linux系统上工作得很好。
#include <hdf5/serial/hdf5.h>
#define FILE "dset.h5"
#define DSET "/dset"
int main() {
hid_t file_id, dataset_id, dataspace_id, memspace;
// hid_t filespace;
hsize_t dims[2], offset[2], count[2];
herr_t status;
unsigned int dset_data[3] = { 10, 20, 30 };
/* Create a new file using default properties. */
file_id = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
/* Create the data space for the dataset. */
dims[0] = 20; /* ROWS */
dims[1] = 3; /* COLS */
dataspace_id = H5Screate_simple(2, dims, NULL);
/* Create the dataset. */
dataset_id = H5Dcreate(file_id, DSET, H5T_STD_I32BE, dataspace_id,
H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
/* Get the memory space */
memspace = H5Dget_space (dataset_id);
offset[0] = 1; /* ROWS */
offset[1] = 0; /* COLS */
count[0] = 1; /* ROWS */
count[1] = 3; /* COLS */
/* Select the slab */
status = H5Sselect_hyperslab(dataspace_id, H5S_SELECT_SET,
offset, NULL, count, NULL);
if(status < 0)
return status;
/* Write the dataset. */
status = H5Dwrite(dataset_id, H5T_NATIVE_INT,
memspace, H5S_ALL, H5P_DEFAULT,
dset_data);
if(status < 0)
return status;
/* End access to the dataset and release resources used by it. */
status = H5Dclose(dataset_id);
if(status < 0)
return status;
/* Terminate access to the data space. */
status = H5Sclose(dataspace_id);
if(status < 0)
return status;
/* Close the file. */
status = H5Fclose(file_id);
return status;
} https://stackoverflow.com/questions/28413089
复制相似问题