【问题标题】:Read from dataset in HDF5 file with datatype detection使用数据类型检测从 HDF5 文件中的数据集读取
【发布时间】:2014-09-12 08:27:56
【问题描述】:

我目前尝试从 C 语言的 hdf5 数据集中读取一些数据,如下所示。

dataset = H5Dopen(ic_group, 'vx', H5P_DEFAULT);
status = H5Dread(dataset, H5T_NATIVE_FLOAT, memspace,H5S_ALL,
                          H5P_DEFAULT, vx_ptr);

status = H5Dclose(dataset);

这里ic_group是一个包含数据集vx的组,memspace是内存中的hyperslab,vx_ptr是内存中的数据。这种方法效果很好,但是由于我以后想使用不同的数据类型,所以我想直接从数据集中读取类型:

hid_t datatype;
datatype = H5Dget_type(dataset);
status = H5Dread(dataset, datatype, memspace,H5S_ALL,
                          H5P_DEFAULT, vx_ptr);

不幸的是,这种方法会导致函数 H5Dread 出现段错误。 也许我错过了什么?感谢您的任何建议。

编辑:我不知道这是否有用,但 gdb 的回溯可以归结为 0x00007ffff5adbd1e in __memcpy_ssse3_back () from /lib64/libc.so.6

【问题讨论】:

  • 您是否在认真检查您存储的状态值?如果不是,您如何知道首先报告故障的位置?
  • 我打印了状态值,每次都得到 0 作为回报,所以这应该没问题。此外,我查看了数据类型 id,即 50331962(在转换为 int 之后),文档说返回 H5Dget_type 的非负值是成功的操作。我用 GDB 调试了程序,所以我知道段错误发生在 H5Dread 中(见编辑)
  • 我下载了HDF5源代码并编译;产生了大量令人沮丧的警告(我在 Ubuntu 14.04 衍生版本上使用 GCC 4.9.1 进行编译)。有些警告是不必要的;其他人显然没有必要(我担心他们)。很少有开源项目在默认编译时会产生如此多的警告;这让我很担心。我需要时间来学习足够的知识以正确使用 HDF5;鉴于我不打算使用 HDF5,我不确定我是否愿意将时间花在这项任务上。
  • 这可能是用于读取和写入数据集的数据类型不匹配。您可以使用H5Tequal() 来检查H5Dget_type(dataset) 是否与用于写入数据的数据类型相同。您可能还需要使用H5Sget_select_type() 来检查memspace 的数据类型。
  • 好的,感谢H5Tequal,我得到了错误,谢谢!实际上,这是在创建不同数据集时出现的问题,其中一个是意外创建为 float64 类型的,因此此错误仅影响一个数据集,导致段错误。在整个节目中。也许你可以以某种方式发布这个作为答案,我会给你一个赞成票。

标签: c hdf5 hdf


【解决方案1】:

您可以使用H5Tequal(datatype, H5T_<type>) 检查从H5Dget_type(dataset) 返回的数据类型是否符合您的预期。它应该与用于写入数据集的数据类型以及vx_ptr 的等效类型匹配(这可能是实际导致段错误的原因)。

另外,datatype 需要用H5Tclose(datatype) 关闭。

【讨论】:

    猜你喜欢
    • 2019-08-02
    • 2016-10-27
    • 2020-05-28
    • 2020-06-21
    • 2023-01-31
    • 2019-08-14
    • 2019-06-24
    • 2014-06-11
    • 2019-11-15
    相关资源
    最近更新 更多