C HDF5:如何将数据附加到数据集(可扩展阵列)

C HDF5:如何将数据附加到数据集(可扩展阵列),c,hdf5,C,Hdf5,通过以下步骤,我尝试扩展我的HDF5数据集。代码如下,但是数据未正确写入数据集(数据集具有正确的最终大小,但仅包含零)。与本教程的唯一区别是,我必须使用动态数组。有什么想法吗 int main() { hsize_t dims[1], max_dims[1], newdims[1], chunk_dims[1], offset[1]; hid_t file, file_space, plist, dataset, mem_space; int32_t *buffe

通过以下步骤,我尝试扩展我的HDF5数据集。代码如下,但是数据未正确写入数据集(数据集具有正确的最终大小,但仅包含零)。与本教程的唯一区别是,我必须使用动态数组。有什么想法吗

int main()
{    
    hsize_t dims[1], max_dims[1], newdims[1], chunk_dims[1], offset[1];
    hid_t file, file_space, plist, dataset, mem_space;
    int32_t *buffer1, *buffer2;

    file = H5Fcreate("test.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);

    // Create dataspace with initial dim = 0 and final = UNLIMITED
    dims[0] = 0;
    max_dims[0] = H5S_UNLIMITED;
    file_space = H5Screate_simple(RANK, dims, max_dims);

    // Create dataset creation property list to have chunks
    plist = H5Pcreate(H5P_DATASET_CREATE);
    H5Pset_layout(plist, H5D_CHUNKED);
    chunk_dims[0] = 2;
    H5Pset_chunk(plist, RANK, chunk_dims);

    // Create the dataset
    dataset = H5Dcreate(file, "Test", H5T_NATIVE_INT32, file_space, H5P_DEFAULT, plist, H5P_DEFAULT);

    H5Pclose(plist);
    H5Sclose(file_space);

    //## FIRST BUFFER

    int length = 6;
    buffer1 = new int32_t[length];
    for (hsize_t i = 0; i < length; i++)
        buffer1[i] = i;

    // Extend the dataset by getting previous size and adding current length
    file_space = H5Dget_space(dataset);
    H5Sget_simple_extent_dims(file_space, dims, NULL);
    newdims[0] = dims[0] + length;
    H5Dset_extent(dataset, newdims);

    // Select hyperslab on the file dataset
    offset[0] = dims[0];
    dims[0] = length;
    H5Sselect_hyperslab(file_space, H5S_SELECT_SET, offset, NULL, dims, NULL);

    // Dataspace for buffer in memory
    mem_space = H5Screate_simple(RANK, dims, NULL);

    // Append buffer to dataset
    H5Dwrite(dataset, H5T_NATIVE_INT32, mem_space, file_space, H5P_DEFAULT, buffer1);

    H5Sclose(file_space);
    H5Sclose(mem_space);

    //## SECOND BUFFER

    length = 4;
    buffer2 = new int32_t[length];
    for (hsize_t i = 0; i < length; i++)
        buffer2[i] = i;

    // Extend the dataset by getting previous size and adding current length
    file_space = H5Dget_space(dataset);
    H5Sget_simple_extent_dims(file_space, dims, NULL);
    newdims[0] = dims[0] + length;
    H5Dset_extent(dataset, newdims);

    // Select hyperslab on the file dataset
    offset[0] = dims[0];
    dims[0] = length;
    H5Sselect_hyperslab(file_space, H5S_SELECT_SET, offset, NULL, dims, NULL);

    // Dataspace for buffer in memory
    mem_space = H5Screate_simple(RANK, dims, NULL);

    // Append buffer to dataset
    H5Dwrite(dataset, H5T_NATIVE_INT32, mem_space, file_space, H5P_DEFAULT, buffer2);

    H5Sclose(file_space);
    H5Sclose(mem_space);

    H5Dclose(dataset);
    H5Fclose(file);

   delete[] buffer1;
   delete[] buffer2;
}
intmain()
{    
尺寸[1]、最大尺寸[1]、新尺寸[1]、块尺寸[1]、偏移量[1];
隐藏文件、文件空间、plist、数据集、内存空间;
int32_t*buffer1,*buffer2;
文件=H5Fcreate(“test.h5”、H5F_ACC_TRUNC、H5P_DEFAULT、H5P_DEFAULT);
//创建初始尺寸为0,最终尺寸为无限的数据空间
dims[0]=0;
max_dims[0]=H5S_无限;
文件空间=H5Screate_simple(秩、dims、最大dims);
//创建数据集创建属性列表以包含块
plist=H5Pcreate(H5P_数据集_创建);
H5Pset_布局(plist、H5D_分块);
chunk_dims[0]=2;
H5Pset_chunk(plist、RANK、chunk_dims);
//创建数据集
数据集=H5Dcreate(文件,“测试”,H5T_NATIVE_INT32,文件空间,H5P_默认值,plist,H5P_默认值);
H5Pclose(plist);
H5Sclose(文件空间);
//##第一缓冲区
整数长度=6;
buffer1=新的int32_t[长度];
对于(hsize_t i=0;i
我已经想出了解决这个问题的办法。它与动态数组无关。问题是,在调用
H5Sget\u simple\u extent\u dims
后,数据空间id会以某种方式失效(我不明白为什么…一个bug?),您需要在重用它之前再次获取它,例如,在选择hyperslab之前:

// Select hyperslab on the file dataset
offset[0] = dims[0];
dims[0] = length;
H5Dclose(file_space); // --ADDED-- CLOSE THE PREVIOUSLY OPENED
file_space = H5Dget_space(dataset); // --ADDED-- REOPEN
H5Sselect_hyperslab(file_space, H5S_SELECT_SET, offset, NULL, dims, NULL);

根据文档(我没有使用过C API),H5Dget_空间制作了数据集的副本。H5Dset_区段在原始数据集上工作,而不是在副本上工作。在获得新的缓冲区之前,您应该关闭(文件空间)。@mpez0在我最初的帖子中,我确实在重新打开第二个缓冲区之前关闭了它,但它仍然不工作。事实上,在呼叫H5Sget_simple_extent_dims之后,您必须重新打开,当然,在重新打开之前,正如您所说,我们需要关闭它(我在回答中添加了这一行)。这是一个非常重要的注意事项,在文档中肯定应该更好地强调这一点。