Tôi chỉ chọn lên HDF5 và tôi hơi bối rối về sự khác biệt giữa việc tạo dữ liệu cho bộ nhớ và tạo dữ liệu cho tệp. Có gì khác biệt?HDF5 Loại hợp chất Gốc so với IEEE
Trong this dụ, tạo ra một kiểu dữ liệu hợp chất đòi hỏi dữ liệu được tạo ra trong bộ nhớ và được đặt trong 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);
Tuy nhiên, trong một ví dụ khác here, tác giả cũng tạo ra một dữ liệu hợp chất cho tệp, chỉ định một kiểu dữ liệu khác. Ví dụ, khi tạo kiểu dữ liệu cho bộ nhớ, serial_no sử dụng loại H5T_NATIVE_INT, nhưng khi tạo kiểu dữ liệu cho tệp, serial_no đã sử dụng H5T_STD_I64BE. Tại sao anh ta làm việc này?
/*
* 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);
Sự khác nhau giữa hai phương pháp này là gì?
cảm ơn bạn, đó là rất rõ ràng – foboi1122
từ giải thích của tôi: nó là ok để có loại tập tin với NATIVE_some_type; đó là trách nhiệm của khách hàng khi lập bản đồ khi đọc lại nội dung. nói cách khác: "Khi tập tin này được sử dụng bởi một hệ thống MIPS, nó sẽ đọc số như H5T_STD_I32BE, mà không được mong đợi." là không đúng sự thật; khách hàng nên đọc lại loại tệp và tạo bố cục bộ nhớ tương ứng. Máy khách nên mong đợi thứ tự byte không khớp và giảm thiểu nó với ánh xạ thích hợp. Ví dụ này chứng minh rằng thứ tự byte/bố cục tệp được tách riêng khỏi thứ tự/bố trí byte của máy chủ (bộ nhớ). –
@StevenVarga Nếu sử dụng H5T_NATIVE_INT, bạn không biết nó là endian lớn hay nhỏ endian, trừ khi bạn đặt một lá cờ ở đâu đó nói thứ tự byte là gì. Ngay cả khi bạn biết thứ tự byte thực sự, nó không phải là nỗ lực tầm thường để chuyển đổi tất cả dữ liệu sau khi chúng được nạp. Và việc bảo trì mã cũng khó khăn. Quan tâm làm gì? Tại sao không sử dụng thứ tự byte rõ ràng khi lưu vào tệp? – Chen