5

私は 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);

これら2つの方法の違いは何ですか?

4

2 に答える 2

5

http://www.hdfgroup.org/HDF5/doc/UG/UG_frame11Datatypes.htmlから:

H5T_NATIVE_INT は C の int 型に対応します。Intel ベースの PC では、このタイプは H5T_STD_I32LE と同じですが、MIPS システムでは H5T_STD_I32BE と同等です。

つまり、H5T_NATIVE_INT は、プロセッサの種類によってメモリ レイアウトが異なります。データがメモリ内でのみ使用される場合、つまりデータがこのマシンの外に出ない場合は、パフォーマンスを向上させるために H5T_NATIVE_INT を使用することをお勧めします。

ただし、データがファイルに保存され、別のシステムで使用される場合は、データを正しく読み取れるように特定の int 型を指定する必要があります (例: H5T_STD_I64BE または H5T_STD_I32LE)。H5T_NATIVE_INT を使用し、Intel ベースの PC でデータ ファイルを作成した場合、数値は H5T_STD_I32LE として保存されます。このファイルが MIPS システムで使用されると、番号が予期しない H5T_STD_I32BE として読み取られます。

于 2013-03-01T02:27:58.793 に答える