【问题标题】:HDF5 writing a string header to a fileHDF5将字符串头写入文件
【发布时间】:2014-06-20 12:58:18
【问题描述】:

我正在尝试从 C++ 编写 HDF5 文件。该文件基本上包含以下格式的大型时间序列矩阵

TimeStamp    Property1      Property2

我已经成功写入数据,我创建了一个 dset 并使用了 H5Dwrite 函数。

现在我的问题是如何创建文件头,换句话说,如果我想将以下数组写入文件...

['TimeStamp', 'Property1', 'Property2']

...并将其标记到列以方便以后使用(我打算在 Python 中分析矩阵)。该怎么做?

我尝试使用 H5Dwrite 编写字符串数组但失败了,我猜它想要一致的数据类型,所以它只想要浮点数,这是我的数据的数据类型。然后我读到了这个元数据的东西,但我对如何使用它有点迷茫?任何帮助将不胜感激。

一个相关的附带问题是矩阵的第一行可以是字符串,其他行是否包含双精度数?

【问题讨论】:

    标签: string hdf5


    【解决方案1】:

    清洁溶液

    如果您将数据存储为 compound datatype 的一维数组,其中包含成员 TimeStampProperty1Property2 等,那么字段名称将存储为元数据,并且应该易于读取蟒蛇。

    我认为还有另一个干净的选项,但我只提一下,因为我自己从未使用过它:HDF5's Table Interface。阅读文档,看看您是否愿意使用它。

    直接回答您的问题

    现在是脏选项:您可以将字符串属性添加到现有数据集。有多种方法可以做到这一点。您可以有一个字符串属性,其中所有字段名称用分号分隔,或者每列一个属性。我不推荐它,因为那会非常不标准。

    一个相关的附带问题是矩阵的第一行可以是字符串,其他行是否包含双精度数?

    没有。

    使用复合数据类型的示例

    假设你有一个这样定义的结构:

    struct Point { double timestamp, property1, property2; };
    

    Points的向量:

    std::vector<Point> points;
    

    以及数据集dset 和适当的内存和文件数据空间,然后您可以像这样创建复合数据类型:

    H5::CompType type(sizeof(DataPoint));
    type.insertMember("TimeStamp", HOFFSET(Point, timestamp), H5::PredType::NATIVE_DOUBLE);
    type.insertMember("Property1", HOFFSET(Point, property1), H5::PredType::NATIVE_DOUBLE);
    type.insertMember("Property2", HOFFSET(Point, property2), H5::PredType::NATIVE_DOUBLE);
    

    并像这样将数据写入文件:

    dset.write(&points[0], type, mem_space, file_space);
    

    【讨论】:

    • 谢谢西蒙,我希望你能加入并阐明一些观点,因此不胜感激。话虽如此,我是一个真正的菜鸟,也迷路了。我实际上很有趣地关注了这个帖子,你也回答了,stackoverflow.com/questions/15379399/…。这基本上就是我想要做的。你能给我一两句关于如何设置复合数据类型的信息吗?基本上在您的示例术语中,如果有意义的话,缓冲区是一个带有名称列的缓冲区。
    • 基本上我希望能够以块的形式写入数据,因为写入过程连接到实时回调过程,该过程会在数据实时发生时写入数据。我之前在链接中使用过您以前的解决方案并且它有效,只是现在我想命名我的数据列,正如我在这篇文章中提到的那样。如果您能指点我修改您之前的帖子以包含命名缓冲区的工具,我将不胜感激。
    • 我添加了一个例子。我使用了 C++ API,因为您在问题中提到了 C++,但是如果您使用 C API,这个想法是一样的。除了数据类型,与my answer to the other question 相比没有任何变化。
    • 非常感谢西蒙,我还是有点卡住了 :) 你想让我围绕你之前的答案创建一个新帖子吗?基本上我不知道如何 1) 调整内存 data_space 的大小并扩展数据集 2) 选择 hyperslab 并将“点”附加到它 3) 为什么你使用 dset.write 而不是 H5Dwrite。我可以创建一个新帖子,并输入我正在尝试的内容,然后您可以对其进行编辑。嘿,非常感谢您在这方面的帮助!
    • 基本上你必须结合extensible dataset + compound datatype。是的,如果您尽最大努力创建一个新问题并解释您卡在哪里(并将其标记为 C),这可能会更好。
    猜你喜欢
    • 2011-10-24
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多