最近在做城市計算的項目,數據文件是以.h5的格式存儲的,總結下其用法和特點
來自百度百科的簡介:
HDF(Hierarchical Data Format),可以存儲不同類型的圖像和數碼數據的文件格式,並且可以在不同類型的機器上傳輸,同時還有統一處理這種文件格式的函數庫。大多數計算機都支持這種文件格式。
目前常用的圖像文件格式很多,如GIF,JPG,PCX,TIFF等。這些格式共同的缺點是結構太簡單,不能存放除影像信息外其他的有用數據,像遙感影像的坐標值、參數等都無法在其中保存,而且用不同格式存儲影像數據使得讀取、傳輸、共享變得復雜,因此,有必要建立一種標准格式以解決上述問題。
HDF是美國國家高級計算應用中心為了滿足各種領域研究需求而研制的一種能高效存儲和分發科學數據的新型數據格式。HDF可以表示出科學數據存儲和分布的許多必要條件。HDF被設計為:
自述性:對於一個HDF文件里的每一個數據對象,有關該數據的綜合信息(元數據)。在沒有任何外部信息的情況下,HDF允許應用程序解釋HDF文件的結構和內容。
通用性:許多數據類型都可以被嵌入在一個HDF文件里。例如,通過使用合適的HDF數據結構、符號、數字和圖形數據可以同時存儲在一個HDF文件里。
靈活性:HDF允許用戶把相關的數據對象組合在一起,放到一個分層結構中,向數據對象添加描述和標簽。它還允許用戶把科學數據存放到多個HDF文件里。
擴展性:HDF極易容納將來新增的數據模式,容易與其他標准格式兼容。
跨平台性:HDF是一個與平台無關的文件格式。HDF文件無需任何轉換就可以在不同平台上使用。
科學家通常在不同的機器上生成和處理數據文件。各式各樣的軟件包被用來多種處理文件,同時也與其他使用不同機器和軟件的人共享數據文件。在一組文件里,這些文件也許包含不同類型的信息。這些不同類型的信息混合結構在一個文件里的意義與另一個文件的意義不同。這些文件也許概念上有關但在實質上卻不同。HDF通過提供一個一般目的的文件結構來表明這些問題:HDF為程序提供一個從數據文件本身獲取數據信息的機制,而不是其他來源。
一、python讀取HFD5文件
HDF5是一種層次化的格式(hierarchial format),經常用於存儲復雜的科學數據。例如MATLAB就是用這個格式來存儲數據,在存儲帶有關聯的元數據(medata)的復雜層次化數據的時候,這個格式非常有用。例如計算機模擬實驗室的運算結果等等。與HDF5相關的主要概念有以下幾個:
文件file:層次化數據的容器,相當於樹根(‘root’ for tree)
組group:樹的一個節點(node for a tree)
數據集 dataset:數值數據的數組,可以非常非常大
屬性atrribute:提供額外信息的小塊的元數據
python操作HDF5文件:https://www.jianshu.com/p/998c861d32e3
示例:創建hdf5文件
1 import os 2 import h5py 3 import numpy as np 4 5 imgData = np.zeros((4392,2,16,8)) 6 7 if not os.path.exists('1.h5'): 8 with h5py.File('1.h5') as f: 9 f['data'] = imgData 10 f['labels'] = range(100)
示例:讀取
import os import h5py import numpy as np with h5py.File('test.hdf5') as f: print(f) print(f.keys)
HDF5的優點:
速度、內存占用,壓縮程度都比cPickle+gzip來的優秀。
與其他方式對比:
1、numpy.save, numpy.savez, scipy.io.savemat
numpy和scipy提供的數據存儲方法,官方說save的壓縮版,盡管在實踐中,什么都沒能壓縮到。
而且這三個方法產生的文件大小都一樣的...非常大。
2、cPickle+gzip
這里忽略pickle這家伙,直接被cPickle虐了
.pkl.gz是mnist的官方后綴。看來是會很好用的樣子。
但在實際使用中,有兩個難以避免的問題:
速度慢,內存占用高(就是性能不好)
大矩陣存儲無能
3、h5py
基本找不到缺點,唯一的缺點是很難安裝。
參考:http://www.cnblogs.com/Ponys/p/3671458.html