gpt4 book ai didi

c++ - HDF5 中的嵌套复合数据类型

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:23:21 27 4
gpt4 key购买 nike

我是 C++ 应用程序团队的一员,该应用程序处理各种类型的消息并以各种格式输出它们。出于本次讨论的目的,可以将消息视为名称-值对的集合。这些值通常是数字,但也可以是字符串。消息的结构基本上是在处理时被发现的。 消息可以是任意大的,因此不允许在内存中存储表示。一条消息一次处理一个名称-值对。 消息可以具有内部结构,该结构由名称-值对中的名称捕获。一个很好的类比是在目录层次结构中考虑文件名。

我正在开发一个子系统来处理这些消息并使用低级 HDF5 API 来生成 HDF 输出。由于我上面描述的限制,我使用的方法涉及对消息的两次传递。在第一遍中,我收集布局信息并构建复合数据类型和数据集。然后我再次传递消息以写出值。因为我在写 一次输出一个值 ,我有一个这样的序列:


// name, value, dataType, dtSize, ctDataSet and ctSpace have been defined elsewhere
hid_t valueDT = H5Tcreate(H5T_COMPOUND, dtSize);
herr_t status = H5Tinsert(valueDT, name, 0, dataType);
hid_t filespace = H5Dget_space(ctDataSet);
hsize_t offset[] = { 0 };
hsize_t dim[] = [ 1 };
status = H5Sselect_hyperslab(filespace, H5S_SELECT_SET, offset, NULL,
dim, NULL);
status = H5Dwrite(ctDataSet, valueDT, ctSpace, filespace, H5P_DEFAULT, &value);

我已经开始工作了,我现在正在尝试扩展它以处理嵌套的复合数据类型。我已经完成了第一次传球,但我被困在第二次传球上。代码片段中的代码构建了一个与值关联的独立数据类型,为它指定了一个与数据集中现有字段相对应的名称,然后引导 HDF5 将该值作为数据集的一部分写出。 我意识到我没有明确说明所使用的名称。假设我们正在查看位置中的字段 x。使用的名称将是 position.x。

当值属于内部复合数据类型时,我对如何进行关联感到困惑。任何见解将不胜感激。

最佳答案

您需要在每个嵌套级别创建正确的 HDF5 数据类型,从底部开始。然后,您可以使用总复合数据类型创建数据集并继续将数据写入文件。

我刚刚完成了这样的事情,只是我在 Common Lisp 中使用了 HDF5。我最终做的是定义一个类型规范(听起来像你的消息)来完整描述数据类型的结构,然后使用内存(记住函数输出的花哨词)生成 C 结构。

例如:假设您有以下结构(伪代码):

Type = {
x of Xtype;
y of Ytype;
}

您将通过执行为 Type 创建复合数据类型
  • 为 Xtype 创建 HDF5 数据类型(这是递归的,应该记住)
  • 为 Ytype 创建 HDF5 数据类型(如此)
  • 使用 Xtype 和 Ytype 的 HDF5 数据类型为 Type 创建 HDF5 数据类型。

  • 这确实要求在第一次通过时您已经完全确定了数据类型的结构,但这听起来不像是您这样做的方式的问题。

    为了扩展这个例子,你需要做的是
  • 获取复合结构的数据类型规范列表。
  • (递归地)为每个类型规范生成一个 HDF5 数据类型
  • 从生成的 HDF5 数据类型组装总 HDF5 复合类型。

  • 将数据填充到(递归)复合结构中

    对此,一般有两种方法。

    源代码生成

    您可以在第一次传递数据期间创建用于访问/填充结构的代码。如果您想编写了解 C/C++ 结构和类的代码,这是必要的,因为数据类型是静态的,所以如果一个类型在编译时不存在,那么它在运行时就不能存在。因此,您可以通过生成 C++ 代码在编译时使该类型存在,然后编译该代码,然后作为第二遍运行。

    这种方法对于您正在做的事情听起来不太有希望,因为听起来您将处理相当大的消息流,这将需要相当多的代码生成和编译。所以,进入下一个方法:

    原始二进制数据访问

    这种方法完全取消了对结构使用静态类型,从而消除了生成 C/C++ 复合类型的要求。

    您要做的是使用您拥有的关于数据类型的信息来计算复合数据类型的总大小以及类型成员应出现在总类型的内存块中的位置的偏移量。这可以像 HDF5 类型生成一样递归完成。

    示例:如果您有复合类型
    Type = {
    x of Xtype;
    y of Ytype;
    }

    你会
  • 获取Type的总大小通过递归下降到 Type 的结构,求和 Xtype 的大小和 Ytype它们是通过以相同的方式下降到它们的结构中找到的。
  • 分配大小Type内存中的字节。
  • 获取构成 Type 的所有基本结构元素的偏移量目的。所以如果 Xtype是复合的,那么你必须得到Xtype的成员,如果其中任何一个是复合的,你就会得到它的成员,等等。
  • 将每个基本结构元素以适当的偏移量写入分配的内存中。这也必须递归地完成,因为 XtypeYtype可能是复合类型。

  • 这种方法有效,因为数据(至少从程序员的角度来看)是连续分配的,因此 xy并排放置在分配的内存中。

    在这种方法中,您不得不放弃使用结构/类的便利,但这就是编译器在幕后管理结构/类的方式。

    关于c++ - HDF5 中的嵌套复合数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20098573/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com