我有一个复合类型(int、double、double)的 HDF5 文件。目前,我按照文档中的示例,通过将其结果存储在结构数组中,在单个操作中读取它。
但是,我宁愿将这三个部分中的每一个都保存在不同的数组中,所以我想提供 3 个指针 (int*, double*, double*) 并直接在 3 个数组中读取数据而不复制数据。
有人对如何做到这一点有建议吗?
我有一个复合类型(int、double、double)的 HDF5 文件。目前,我按照文档中的示例,通过将其结果存储在结构数组中,在单个操作中读取它。
但是,我宁愿将这三个部分中的每一个都保存在不同的数组中,所以我想提供 3 个指针 (int*, double*, double*) 并直接在 3 个数组中读取数据而不复制数据。
有人对如何做到这一点有建议吗?
我认为直接不可能。
您可以轻松地将结构数组复制到循环中的三个数组中:
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 不起作用,因为我相信复合类型是原子的。无论如何,复合类型意味着数据以复合方式存储在文件中,因此以这种方式读取它可能更有效。如果您的数组非常大,我给您的解决方案的唯一限制是内存。在现代计算机上应该没问题;)
您可以在复合类型中定义单个字段。假设您的数据集以三个元素的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);
这应该按照您的要求进行。也许您已经通过“读取文件三遍”来做到这一点?