Файлы монтирования HDF5 (с H5Fmount)

Я пытаюсь смонтировать разные файлы, которые имеют одинаковую структуру, в один новый (в C ++).
Поэтому я создаю новый файл «new.h5» и там новую группу «/ G».
Существующие два файла («file1.h5» и «file2.h5») имеют некоторые атрибуты в корневой группе «/», а затем путь «dataset1 / data1 / data», где «dataset1 / data1» содержит некоторые атрибуты и «data» — путь с числовыми данными в нем.

 /dataset1
/attribute1
/attribute2
/data1
/data
/attribute1
/attribute2

В новом файле я хочу структуру:

/G
/dataset1
/attribute1
/attribute2
/data1
/data
/attribute1
/attribute2
/dataset2
/attribute1
/attribute2
/data1
/data
/attribute1
/attribute2

Я попробовал это так:

#include "hdf5.h"#ifdef OLD_HEADER_FILENAME
#include <iostream.h>
#else
#include <iostream>
#endif
#include <string>
#ifndef H5_NO_NAMESPACE
#ifndef H5_NO_STD
using std::cout;
using std::endl;
#endif // H5_NO_STD
#endif
#include "H5Cpp.h"#ifndef H5_NO_NAMESPACE
using namespace H5;
#endif

#define FILE_NAME_1 "file1.h5"#define FILE_NAME_2 "file2.h5"#define FILE_NAME_ALL "new.h5"
int main(void)
{

hid_t fid1, fid2, fid3, gid;  /* Files and group identifiers */

fid1 = H5Fopen(FILE_NAME_1, H5F_ACC_RDWR, H5P_DEFAULT);
fid2 = H5Fopen(FILE_NAME_2, H5F_ACC_RDWR, H5P_DEFAULT);
fid3 = H5Fcreate(FILE_NAME_ALL, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);

gid = H5Gcreate2(fid3, "/G", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
H5Gclose(gid);

/*
* Mount second file under G in the first file.
*/
H5Fmount(fid3, "/G", fid1, H5P_DEFAULT);
H5Fmount(fid3, "/G", fid2, H5P_DEFAULT);

H5Fclose(fid1);
H5Fclose(fid2);
H5Fclose(fid3);

return 0;
}

Когда я смотрю на new.h5 с h5dump Я получил:

h5dump new.h5
HDF5 "new.h5" {
GROUP "/" {
GROUP "G" {
}
}
}

поэтому я создал группу G, но в ней нет файлов ?!
Что пошло не так?

И есть ли возможность переименовать «dataset1» из второго файла в «dataset2» при монтировании файлов или я должен сделать это раньше?

Спасибо!

РЕДАКТИРОВАТЬ:

Возможно, я обнаружил проблему: я хочу смонтировать файлы из корневой группы. Что я имею в виду: я хочу иметь общий файл, который содержит все из двух других файлов. Это затрудняет поиск точки крепления. Это не может быть корневой каталог, но в существующих файлах нет групп с именем «/ G».
Как я могу решить это?

1

Решение

Это правильное поведение. С помощью H5Fmount монтирует файл только в этом месте в памяти. Поэтому, когда вы закрываете файлы и выходите из своей программы, новый файл (new.h5) не отображает (и не отображает) содержимое подключенных файлов.

Если вы хотите такого поведения, используйте H5Lcreate_external создавать внешние ссылки.

Я изменил ваш код на C (не C ++ — извините, но идея та же):

#include <stdlib.h>
#include <stdio.h>
#include <hdf5.h>

#define FILE_NAME_1 "file1.h5"#define FILE_NAME_2 "file2.h5"#define FILE_NAME_ALL "new.h5"
int main(void)
{

hid_t fid1;  /* Files identifier */

fid1 = H5Fcreate(FILE_NAME_ALL, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);

/*
* Link "file1.h5" to group F1
*/
H5Lcreate_external(FILE_NAME_1, "/", fid1, "/F1", H5P_DEFAULT, H5P_DEFAULT);

/*
* Link "file2.h5" to group F2
*/
H5Lcreate_external(FILE_NAME_2, "/", fid1, "/F2", H5P_DEFAULT, H5P_DEFAULT);

H5Fclose(fid1);

return 0;
}

Где содержимое file1.h5 а также file2.h5 одинаковы для теста:

h5dump file1.h5
HDF5 "file1.h5" {
GROUP "/" {
DATASET "D" {
DATATYPE  H5T_STD_I32LE
DATASPACE  SIMPLE { ( 4, 5 ) / ( 4, 5 ) }
DATA {
(0,0): 0, 1, 2, 3, 4,
(1,0): 1, 2, 3, 4, 5,
(2,0): 2, 3, 4, 5, 6,
(3,0): 3, 4, 5, 6, 7
}
}
}
}

Затем, если мы скомпилируем и запустим тестовую программу:

h5cc -o test test.c && ./test

Наконец дамп нового файла:

h5dump new.h5
HDF5 "new.h5" {
GROUP "/" {
EXTERNAL_LINK "F1" {
TARGETFILE "file1.h5"TARGETPATH "/"GROUP "/" {
DATASET "D" {
DATATYPE  H5T_STD_I32LE
DATASPACE  SIMPLE { ( 4, 5 ) / ( 4, 5 ) }
DATA {
(0,0): 0, 1, 2, 3, 4,
(1,0): 1, 2, 3, 4, 5,
(2,0): 2, 3, 4, 5, 6,
(3,0): 3, 4, 5, 6, 7
}
}
}
}
EXTERNAL_LINK "F2" {
TARGETFILE "file2.h5"TARGETPATH "/"GROUP "/" {
DATASET "D" {
DATATYPE  H5T_STD_I32LE
DATASPACE  SIMPLE { ( 4, 5 ) / ( 4, 5 ) }
DATA {
(0,0): 0, 1, 2, 3, 4,
(1,0): 1, 2, 3, 4, 5,
(2,0): 2, 3, 4, 5, 6,
(3,0): 3, 4, 5, 6, 7
}
}
}
}
}
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]