HDF5 тип соединения нативный против IEEE

Я просто беру HDF5, и меня немного смущает разница между созданием данных для памяти и созданием данных для файла. Какая разница?

В этот Например, создание данных составного типа требует, чтобы данные были созданы в памяти и помещены в файл:

 /*
* 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);

Однако в другом примере Вот, автор также создает составные данные для файла, который указывает другой тип данных. Например, при создании типа данных для памяти, serial_no используется тип H5T_NATIVE_INT, но при создании типа данных для файла использовался serial_no H5T_STD_I64BE. Почему он это делает?

    /*
* 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);

В чем разница между этими двумя методами?

5

Решение

От http://www.hdfgroup.org/HDF5/doc/UG/UG_frame11Datatypes.html:

H5T_NATIVE_INT соответствует типу C int. На ПК на базе Intel этот тип совпадает с H5T_STD_I32LE, а в системе MIPS это будет эквивалентно H5T_STD_I32BE.

То есть H5T_NATIVE_INT имеет разную структуру памяти на разных типах процессоров. Если ваши данные используются только в памяти, что означает, что ваши данные не будут отправляться с этого компьютера, вы можете использовать H5T_NATIVE_INT для повышения производительности.

Но если ваши данные будут сохранены в файл и будут использоваться разными системами, вы должны указать определенный тип int, чтобы ваши данные могли быть прочитаны правильно, например, H5T_STD_I64BE или H5T_STD_I32LE. Если вы используете H5T_NATIVE_INT и создали файл данных на ПК на базе Intel, номер будет сохранен как H5T_STD_I32LE. Когда этот файл используется системой MIPS, он будет читать число как H5T_STD_I32BE, что не ожидается.

5

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

Другой ответ здесь пропускает некоторые ключевые идеи и делает использование типов данных HDF5 более сложным, чем сейчас.

Начнем с того, что типы NATIVE — это просто псевдонимы для того, что сопоставляет типы C на этой платформе (это обнаруживается при сборке библиотеки HDF5). Если вы используете их в своем коде и посмотрите на файл, который вы создали с помощью инструмента h5dump, вы не увидите тип данных NATIVE, а вместо этого увидите реальный тип данных (H5T_STD_I32LE или еще много чего). Эти типы NATIVE, по общему признанию, немного сбивают с толку, но они удобны для отображения между типами C и типами данных HDF5 без необходимости знать порядок байтов системы, в которой вы находитесь.

Другое заблуждение, которое я хочу прояснить, заключается в том, что библиотека будет преобразовывать типы для вас, когда это целесообразно. Если набор данных содержит значения H5T_STD_I32BE и вы объявляете буфер ввода-вывода как H5T_NATIVE_INT в системе с прямым порядком байтов, библиотека HDF5 преобразует целые числа набора данных с прямым порядком байтов в целые числа с прямым порядком байтов в памяти для вас. Вам не нужно выполнять замену байтов самостоятельно.

Вот простой способ думать об этом:

  • Вы заявляете тип хранения набора данных когда вы вызываете H5Dcreate ().
  • Вы заявляете тип данных буфера ввода / вывода когда вы вызываете H5Dread () и H5Dwrite ().

Опять же, если они различаются и преобразования типов разумны, данные будут преобразованы во время вызовов чтения / записи.

Обратите внимание, что это преобразование типов может повлиять на производительность в критичных ко времени приложениях. Если платформы, на которых данные будут записываться и считываться, различаются по порядку байтов или размеру слова, вы можете явно указать тип данных вместо использования псевдонимов NATIVE, чтобы можно было выполнить преобразование на менее важной платформе.

Пример. Предположим, у вас есть программа записи BE и программа чтения LE, и данные поступают медленно, но чтение должно быть максимально быстрым. в этом случае вы захотите явно создать свой набор данных для хранения данных H5T_STD_I32LE, чтобы преобразования типов данных происходили на устройстве записи.

И последнее. Лучше использовать макрос HOFFSET (s, m) вместо вычисления смещений вручную при построении составных типов. Это удобнее в обслуживании, и ваш код будет выглядеть лучше.

Если вы хотите получить больше информации о типах данных HDF5, ознакомьтесь с главой 6 руководства пользователя здесь:
https://support.hdfgroup.org/HDF5/doc/UG/HDF5_Users_Guide-Responsive%20HTML5/index.html

Вы также можете ознакомиться с документацией по H5T API в справочном руководстве здесь:
https://support.hdfgroup.org/HDF5/doc/RM/RM_H5Front.html

0