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

2024-02-07

依照指示本教程 http://www.hdfgroup.org/ftp/HDF5/current/src/unpacked/examples/h5_extend.c,我尝试扩展我的 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;
}

我已经想出了如何解决这个问题。它与动态数组无关。问题是调用后H5Sget_simple_extent_dims数据空间 ID 以某种方式失效(我不明白为什么......一个错误?)并且您需要在重用它之前再次获取它,例如在选择超级板之前:

// 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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HDF5:如何将数据附加到数据集(可扩展数组) 的相关文章

  • asp.net 文本框文本模式数字,仅允许数字

    我只是想知道 ASP NET 中是否有一种方法只允许文本框中的数字textmode number 当我使用这个时
  • 为什么我不能用 `= delete;` 声明纯虚函数?

    Intro 纯虚函数使用通用语法声明 virtual f 0 然而 自 c 11 以来 有一种方法可以显式地传达non existence 特殊 成员函数的 Mystruct delete eg default constructor Q
  • 32 位应用程序的特征最大矩阵大小

    所以 我正在寻找Eigen http eigen tuxfamily org index php title Main Page当我尝试声明大于 10000x10000 的矩阵时 包崩溃 我需要声明一个像这样的矩阵 可靠地大约有 13000
  • 使用post方法将多个参数发送到asp.net core 3 mvc操作

    使用 http post 方法向 asp net mvc core 3 操作发送具有多个参数的 ajax 请求时存在问题 参数不绑定 在 dot net 框架 asp net web api 中存在类似的限制 但在 asp net mvc
  • 构造函数中显式关键字的使用

    我试图了解 C 中显式关键字的用法 并查看了这个问题C 中的explicit关键字是什么意思 https stackoverflow com questions 121162 但是 那里列出的示例 实际上是前两个答案 对于用法并不是很清楚
  • 检查算术运算中的溢出情况[重复]

    这个问题在这里已经有答案了 可能的重复 检测 C C 中整数溢出的最佳方法 https stackoverflow com questions 199333 best way to detect integer overflow in c
  • Qt 创建布局并动态添加小部件到布局

    我正在尝试在 MainWindow 类中动态创建布局 我有四个框架 它们是用网格布局对象放置的 每个框架都包含一个自定义的 ClockWidget 我希望 ClockWidget 对象在调整主窗口大小时相应地调整大小 因此我需要将它们添加到
  • Azure 事件中心 - 按顺序接收事件

    我使用下面的代码从 Azure Event Hub 接收事件 https learn microsoft com en us azure event hubs event hubs dotnet framework getstarted s
  • 基于xsd模式生成xml(使用.NET)

    我想根据我的 xsd 架构 cap xsd 生成 xml 文件 我找到了这篇文章并按照说明进行操作 使用 XSD 文件生成 XML 文件 https stackoverflow com questions 6530424 generatin
  • C# 中条件编译符号的编译时检查(参见示例)?

    在 C C 中你可以这样做 define IN USE 1 define NOT IN USE 1 define USING system 1 system 1 IN USE 进而 define MY SYSTEM IN USE if US
  • 为什么我不应该对不是由 malloc() 分配的变量调用 free() ?

    我在某处读到 使用它是灾难性的free删除不是通过调用创建的对象malloc 这是真的 为什么 这是未定义的行为 永远不要尝试它 让我们看看当您尝试时会发生什么free 自动变量 堆管理器必须推断出如何获取内存块的所有权 为此 它要么必须使
  • 将构建日期放入“关于”框中

    我有一个带有 关于 框的 C WinForms 应用程序 我使用以下方法将版本号放入 关于 框中 FileVersionInfo GetVersionInfo Assembly GetExecutingAssembly Location F
  • 当模板类不包含可用的成员函数时,如何在编译时验证模板参数?

    我有以下模板struct template
  • 如何挤出平面 2D 网格并赋予其深度

    我有一组共面 连接的三角形 即二维网格 现在我需要将其在 z 轴上挤出几个单位 网格由一组顶点定义 渲染器通过与三角形数组匹配来理解这些顶点 网格示例 顶点 0 0 0 10 0 0 10 10 0 0 10 0 所以这里我们有一个二维正方
  • 获取 2 个数据集 c# 中的差异

    我正在编写一个简短的算法 它必须比较两个数据集 以便可以进一步处理两者之间的差异 我尝试通过合并这两个数据集并将结果更改放入新的数据集来实现此目标 我的方法如下所示 private DataSet ComputateDiff DataSet
  • 将代码拆分为标头/源文件

    我从 Asio 的示例页面中获取了以下代码 class tcp connection public boost enable shared from this
  • 当前的 x86 架构是否支持非临时加载(来自“正常”内存)?

    我知道有关此主题的多个问题 但是 我没有看到任何明确的答案或任何基准测量 因此 我创建了一个处理两个整数数组的简单程序 第一个数组a非常大 64 MB 第二个数组b很小 无法放入 L1 缓存 程序迭代a并将其元素添加到相应的元素中b在模块化
  • WinRT 定时注销

    我正在开发一个 WinRT 应用程序 要求之一是应用程序应具有 定时注销 功能 这意味着在任何屏幕上 如果应用程序空闲了 10 分钟 应用程序应该注销并导航回主屏幕 显然 执行此操作的强力方法是在每个页面的每个网格上连接指针按下事件 并在触
  • Googletest:如何异步运行测试?

    考虑到一个包含数千个测试的大型项目 其中一些测试需要几分钟才能完成 如果按顺序执行 整套测试需要一个多小时才能完成 通过并行执行测试可以减少测试时间 据我所知 没有办法直接从 googletest mock 做到这一点 就像 async选项
  • 匿名结构体作为返回类型

    下面的代码编译得很好VC 19 00 23506 http rextester com GMUP11493 标志 Wall WX Za 与VC 19 10 25109 0 标志 Wall WX Za permissive 这可以在以下位置检

随机推荐