我在将一个线性数组从c ++保存到hdf5文件中的三维数据集时遇到了一个小问题。
内存中的布局如下所示:
|---+---+---+---+---+---+---+---+---+---+----+----|
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
|---+---+---+---+---+---+---+---+---+---+----+----|
虽然它被程序解释为:
x
|---+---+---|
| 0 | 1 | 2 |
z=0 |---+---+---| y
| 3 | 4 | 5 |
|---+---+---|
x
|---+----+----|
| 6 | 7 | 8 |
z=1 |---+----+----| y
| 9 | 10 | 11 |
|---+----+----|
使用以下代码,此数组将保存到HDF5文件中的三维数据集
std::vector<int> buffer;
for(int i = 0; i < 12; ++i)
buffer.push_back(i);
hsize_t dims[3] = {2,3,2};
hisze_t mem_dim[1] = {12};
hid_t file = H5Fcreate (FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
hid_t space = H5Screate_simple (3, dims, NULL);
hid_t mem_space = H5Screate_simple(1,mem_dim,NULL);
hid_t dset = H5Dcreate (file, DATASET, H5T_STD_I32LE, space, H5P_DEFAULT,
H5P_DEFAULT, H5P_DEFAULT);
herr_t status = H5Dwrite (dset, H5T_NATIVE_INT, mem_space, space, H5P_DEFAULT,
&buffer[0]);
这会产生如下布局:
x
|---+---+----|
| 0 | 2 | 4 |
z=0|---+---+----| y
| 6 | 8 | 10 |
|---+---+----|
x
|---+----+----|
| 1 | 3 | 5 |
z=1|---+----+----| y
| 7 | 9 | 11 |
|---+----+----|
我想这是因为行主格式(z是变化最快的索引)。无论如何,是否可以强制hdf5只用一次H5DWrite调用来编写预期的格式?
我想出了这个想法,但它不起作用。我想我得到了超级错误的功能。
... //Same as above, but before H5DWrite
hsize_t start[3];
hsize_t stride[3];
hsize_t count[3];
hsize_t block[3];
//Select two blocks from array. First for z=0, second for z=1
start[0] = 0;
stride[0] = 6;
count[0] = 2;
block[0] = 6;
status = H5Sselect_hyperslab (mem_space, H5S_SELECT_SET, start, stride, count,
block);
start[0] = 0;
start[1] = 0;
start[2] = 0;
stride[0] = 2;
stride[1] = 3;
stride[2] = 1;
count[0] = 1;
count[1] = 1;
count[2] = 2;
block[0] = 2;
block[1] = 3;
block[2] = 1;
status = H5Sselect_hyperslab (space, H5S_SELECT_SET, start, stride, count,
block);
status = H5Dwrite (dset, H5T_NATIVE_INT, mem_space, space, H5P_DEFAULT,
&buffer[0]);
在我对H5Sselect_hyperslab的解释中定义了两个块 mem_space映射到文件空间的两个块。但 实际上结果与上述相同。可能吗 在不重新格式化数组的情况下实现预期的行为 没有在循环中调用H5DWrite? 我
答案 0 :(得分:2)
Hyperslabs只能跳过单元格,不能重新排序。所以我觉得你运气不好。
正如你所说,有两种解决方案:
在文件中重新排序数组。新的维度将是:
hsize_t dims[3] = {2,2,3};
^ ^ ^
z i j
然后你可以在一次写入中转储数组。
在循环中用slab写下你的数组板。
在内存中重新排序数组会浪费时间。