2013-02-28 55 views
5

我只是撿起HDF5,對於爲內存創建數據和爲文件創建數據之間的區別,我有點困惑。有什麼不同?HDF5複合類型本機與IEEE

this例如,在創建複合型數據,需要在存儲器中創建並放置在文件中的數據:

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

然而,在另一示例here,筆者還創建用於一個組合數據文件,它指定了不同的數據類型。例如,在創建內存數據類型時,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的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,這不是預期的。

+0

謝謝你,這是非常清楚的 – foboi1122 2013-03-01 23:36:42

+0

從我的解釋:它可以與NATIVE_some_type文件類型;在回讀內容時進行映射是客戶的責任。換句話說:「當這個文件被MIPS系統使用時,它會將該數字讀作H5T_STD_I32BE,這是不期望的。」不是真的;客戶端應該讀取文件類型,並相應地創建內存佈局。客戶端應該期望字節順序不匹配,並通過適當的映射緩解它。該示例演示文件字節順序/佈局與主機(內存)字節順序/佈局解耦。 – 2014-08-22 19:16:36

+0

@StevenVarga如果使用H5T_NATIVE_INT,你不知道它是大端還是小端,除非你在某處放置了一個標誌,告訴字節順序是什麼。即使您知道實際的字節順序,加載後轉換所有數據也不是一件容易的事情。代碼維護也很困難。何必?保存到文件時爲什麼不使用顯式字節順序? – Chen 2014-08-26 15:54:05

0

這裏的另一個答案是缺少一些主要思想,並使得使用HDF5數據類型看起來比它更難。

首先,NATIVE類型只是C類型在該平臺上映射到的內容的別名(在構建HDF5庫時檢測到)。如果您在代碼中使用它們並查看使用h5dump工具創建的文件,則不會看到NATIVE數據類型,而是會看到真實的數據類型(H5T_STD_I32LE或其他)。這些NATIVE類型肯定有點令人困惑,但它們便於在C類型和HDF5數據類型之間進行映射,而無需知道系統的字節順序。

我想澄清的另一個誤解是,圖書館會在適當的時候爲您轉換類型。如果數據集包含H5T_STD_I32BE值,並且您在小端系統上聲明I/O緩衝區爲H5T_NATIVE_INT,則HDF5庫會將大端數據集整數轉換爲內存中的小端整數。您不需要自己執行字節交換。

這裏是想想一個簡單的方法:

  • 您聲明數據集的存儲數據類型當你調用H5Dcreate()。
  • 當您調用H5Dread()和H5Dwrite()時,您聲明I/O緩衝區的數據類型爲

同樣,如果這些不同且類型轉換合理,數據將在讀/寫調用期間轉換。

請注意,此類型轉換可能會對時間關鍵型應用程序帶來性能影響。如果寫入和讀取數據的平臺按字節順序或字大小不同,則可能需要顯式設置數據類型而不是使用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