Raccolgo solo HDF5 e sono un po 'confuso circa la differenza tra la creazione di dati per la memoria e la creazione di dati per il file. Qual è la differenza?Tipo di composto HDF5 Nativo rispetto a IEEE
In this esempio, la creazione di un tipo di dati composto richiede i dati da creare nella memoria e messi nel file:
/*
* 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);
Tuttavia, in un altro esempio here, l'autore crea anche un dato composti per la file, che specifica un diverso tipo di dati. Ad esempio, nella creazione del tipo di dati per la memoria, serial_no utilizzato tipo H5T_NATIVE_INT, ma nella creazione del tipo di dati per il file, serial_no utilizzato H5T_STD_I64BE. Perché lo fa?
/*
* 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);
Qual è la differenza tra questi due metodi?
ringraziamento tu, questo era molto chiaro – foboi1122
dalla mia interpretazione: è ok avere un tipo di file con NATIVE_some_type; è responsabilità dei clienti eseguire la mappatura durante la lettura del contenuto. in altre parole: "Quando questo file viene utilizzato da un sistema MIPS, leggerà il numero come H5T_STD_I32BE, che non è previsto." non è vero; il client dovrebbe leggere il tipo di file e creare di conseguenza il layout di memoria. Il client dovrebbe aspettarsi la mancata corrispondenza dell'ordine dei byte e attenuarlo con la mappatura corretta. L'esempio dimostra che l'ordine/layout dei byte del file è disaccoppiato dall'ordine/layout del byte host (memoria). –
@StevenVarga Se si usa H5T_NATIVE_INT, non si sa che è big endian o little endian, a meno che non si metta un flag da qualche parte per dire quale sia l'ordine dei byte. Anche se conosci l'effettivo ordine dei byte, non è uno sforzo banale convertire tutti i dati dopo che sono stati caricati. Anche la manutenzione del codice è difficile. Perché preoccuparsi? Perché non utilizzare l'ordine dei byte esplicito quando si salva in un file? – Chen