Po prostu wychwytuję HDF5 i jestem nieco zdezorientowany różnicą między tworzeniem danych dla pamięci i tworzeniem danych dla pliku. Co za różnica?HDF5 Złożony typ Native vs IEEE
W this przykład tworzenia danych typu związek wymaga danych, które mają być tworzone w pamięci i umieszczone w pliku:
/*
* Create the memory data type.
*/
s1_tid = H5Tcreate (H5T_COMPOUND, sizeof(s1_t));
H5Tinsert(s1_tid, "a_name", HOFFSET(s1_t, a), H5T_NATIVE_INT);
H5Tinsert(s1_tid, "c_name", HOFFSET(s1_t, c), H5T_NATIVE_DOUBLE);
H5Tinsert(s1_tid, "b_name", HOFFSET(s1_t, b), H5T_NATIVE_FLOAT);
/*
* Create the dataset.
*/
dataset = H5Dcreate(file, DATASETNAME, s1_tid, space, H5P_DEFAULT);
/*
* Wtite data to the dataset;
*/
status = H5Dwrite(dataset, s1_tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, s1);
Jednak w innym przykładzie here, autor tworzy również dane związek do plik, który określa inny typ danych. Na przykład przy tworzeniu typu danych dla pamięci, serial_no używany typ H5T_NATIVE_INT, ale przy tworzeniu typu danych dla pliku, serial_no używany H5T_STD_I64BE. Czemu on to robi?
/*
* Create the compound datatype for memory.
*/
memtype = H5Tcreate (H5T_COMPOUND, sizeof (sensor_t));
status = H5Tinsert (memtype, "Serial number",
HOFFSET (sensor_t, serial_no), H5T_NATIVE_INT);
status = H5Tinsert (memtype, "Location", HOFFSET (sensor_t, location),
strtype);
status = H5Tinsert (memtype, "Temperature (F)",
HOFFSET (sensor_t, temperature), H5T_NATIVE_DOUBLE);
status = H5Tinsert (memtype, "Pressure (inHg)",
HOFFSET (sensor_t, pressure), H5T_NATIVE_DOUBLE);
/*
* Create the compound datatype for the file. Because the standard
* types we are using for the file may have different sizes than
* the corresponding native types, we must manually calculate the
* offset of each member.
*/
filetype = H5Tcreate (H5T_COMPOUND, 8 + sizeof (hvl_t) + 8 + 8);
status = H5Tinsert (filetype, "Serial number", 0, H5T_STD_I64BE);
status = H5Tinsert (filetype, "Location", 8, strtype);
status = H5Tinsert (filetype, "Temperature (F)", 8 + sizeof (hvl_t),
H5T_IEEE_F64BE);
status = H5Tinsert (filetype, "Pressure (inHg)", 8 + sizeof (hvl_t) + 8,
H5T_IEEE_F64BE);
/*
* Create dataspace. Setting maximum size to NULL sets the maximum
* size to be the current size.
*/
space = H5Screate_simple (1, dims, NULL);
/*
* Create the dataset and write the compound data to it.
*/
dset = H5Dcreate (file, DATASET, filetype, space, H5P_DEFAULT, H5P_DEFAULT,
H5P_DEFAULT);
status = H5Dwrite (dset, memtype, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
Jaka jest różnica między tymi dwoma metodami?
podziękowaniem ty, to było bardzo zrozumiałe, – foboi1122
z mojej interpretacji: dobrze jest mieć typ pliku z NATIVE_some_type; klient jest odpowiedzialny za wykonanie mapowania podczas odczytywania treści. innymi słowy: "Kiedy ten plik jest używany przez system MIPS, odczyta on numer jako H5T_STD_I32BE, co nie jest oczekiwane." to nie jest prawda; klient powinien odczytać typ pliku z powrotem i odpowiednio utworzyć układ pamięci. Klient powinien oczekiwać niedopasowania kolejności bajtów i złagodzić je przy pomocy odpowiedniego odwzorowania. Przykład pokazuje, że kolejność/układ bajtów pliku jest oddzielona od kolejności/układu bajtów hosta (pamięci). –
@StevenVarga Jeśli użyjesz H5T_NATIVE_INT, nie wiesz, że jest to duży endian lub little endian, chyba że umieścisz flagę gdzieś mówiącą, jaka jest kolejność bajtów. Nawet jeśli znasz faktyczną kolejność bajtów, nie jest trywialnym wysiłkiem, aby przekonwertować wszystkie dane po ich załadowaniu. Utrzymanie kodu jest również trudne. Po co się męczyć? Dlaczego nie używać jawnej kolejności bajtów podczas zapisywania do pliku? – Chen