1

我有一个复合类型(int、double、double)的 HDF5 文件。目前,我按照文档中的示例,通过将其结果存储在结构数组中,在单个操作中读取它。

但是,我宁愿将这三个部分中的每一个都保存在不同的数组中,所以我想提供 3 个指针 (int*, double*, double*) 并直接在 3 个数组中读取数据而不复制数据。

有人对如何做到这一点有建议吗?

4

2 回答 2

1

我认为直接不可能。

您可以轻松地将结构数组复制到循环中的三个数组中:

int a[n];
double b[n], c[n];
for (int i = 0; i < n; i++)
{
    a[i] = s[i].a;
    b[i] = s[i].b;
    c[i] = s[i].c;
}

假设s是一个struct { int a; double b; double c; }(常量)大小的数组n,但我感觉您正在寻找一种直接的 HDF5 方式……</p>

显然,hyperslab 不起作用,因为我相信复合类型是原子的。无论如何,复合类型意味着数据以复合方式存储在文件中,因此以这种方式读取它可能更有效。如果您的数组非常大,我给您的解决方案的唯一限制是内存。在现代计算机上应该没问题;)

于 2011-03-15T03:40:29.233 回答
0

您可以在复合类型中定义单个字段。假设您的数据集以三个元素的dset字段打开"a","b","c",然后LENGTH

int a[LENGTH];
double b[LENGTH], c[LENGTH];    

CompType atype(sizeof(int));
atype.insertMember("a", 0, PredType::NATIVE_INT);
dset.read(a, atype);

CompType btype(sizeof(double));
btype.insertMember("b", 0, PredType::NATIVE_DOUBLE);
dset.read(b, btype);

CompType ctype(sizeof(double));
ctype.insertMember("c", 0, PredType::NATIVE_DOUBLE);
dset.read(c, ctype);

这应该按照您的要求进行。也许您已经通过“读取文件三遍”来做到这一点?

于 2015-10-12T17:21:06.333 回答