1. 核心概念
一個HDF5文件是一種存放兩類對象的容器:dataset和group. Dataset是類似於數組的數據集,而group是類似文件夾一樣的容器,存放dataset和其他group。在使用h5py的時候需要牢記一句話:groups類比詞典,dataset類比Numpy中的數組。
HDF5的dataset雖然與Numpy的數組在接口上很相近,但是支持更多對外透明的存儲特征,如數據壓縮,誤差檢測,分塊傳輸。
2. 讀取和保存HDF5文件
1) 讀取HDF5文件的內容
首先我們應該打開文件:
>>> import h5py >>> f = h5py.File('mytestfile.hdf5', 'r')
請記住h5py.File類似Python的詞典對象,因此我們可以查看所有的鍵值:
>>> f.keys() [u'mydataset']
基於以上觀測,文件中有名字為mydataset這樣一個數據集。然后我們可以用類似詞典的方法讀取對應的dataset對象。
>>> dset = f['mydataset']
Dset是一個HDF5的dataset對象,我們可以像Numpy的數組一樣訪問它的屬性和數據。
>>> dset.shape
(100,) >>> dset.dtype dtype('int32') >>> dset[...] = np.arange(100)
2) 創建一個HDF5文件
我們用’w’模式打開文件
>>> import h5py >>> import numpy as np >>> f = h5py.File("mytestfile.hdf5", "w")
然后我們借助文件對象的一系列方法添加數據。其中create_dataset用於創建給定形狀和數據類型的空dataset
>>> dset = f.create_dataset("mydataset", (100,), dtype='i')
我們也可以用現有的Numpy數組來初始化一個dataset
>>> arr = np.arange(100) >>> dset = f.create_dataset("init", data=arr)
3) 分塊存儲策略
在缺省設置下,HDF5數據集在內存中是連續布局的,也就是按照傳統的C序。Dataset也可以在HDF5的分塊存儲布局下創建。也就是dataset被分為大小相同的若干塊隨意地分布在磁盤上,並使用B樹建立索引。
為了進行分塊存儲,將關鍵字設為一個元組來指示塊的形狀。
>>> dset = f.create_dataset("chunked", (1000, 1000), chunks=(100, 100))
也可以自動分塊,不必指定塊的形狀。
>>> dset = f.create_dataset("autochunk", (1000, 1000), chunks=True)
3. HDF5的分層結構
“HDF”代表”Hierarchical Data Format”(分層數據格式). HDF5文件中group對象類似於文件夾,我們創建的文件對象本身就是一個group,稱為root group.
>>> f.name u'/'
創建subgroup是使用create_group的方法實現的。但是我們需要先用讀寫模式打開文件:
>>> f = h5py.File('mydataset.hdf5', 'r+') >>> grp = f.create_group("subgroup")
然后grp就具有和f一樣的方法了。
我們在group上迭代從而得到group內所有的直接附屬的成員(包括dataset和subgroup)
>>> for name in f: ... print name mydataset subgroup subgroup2
為了遍歷一個group內的所有直接和間接成員,我們可以使用group的visit()和visititerms()方法,這些方法需要接收一個回調函數作為參數。
>>> def printname(name): ... print name >>> f.visit(printname) mydataset subgroup subgroup/another_dataset subgroup2 subgroup2/dataset_three
4. 屬性
HDF5的一個很棒的特點是你可以在數據旁邊存儲元數據。所有的group和dataset都支持叫做屬性的數據形式。屬性通過attrs成員訪問,類似於python中詞典格式。
>>> dset.attrs['temperature'] = 99.5 >>> dset.attrs['temperature'] 99.5 >>> 'temperature' in dset.attrs True
5. 高級特征
1) 濾波器組
HDF5的濾波器組能夠對分塊數組進行變換。最常用的變換是高保真壓縮。使用一個特定的壓縮濾波器創建dataset之后,讀寫都可以向平常一樣,不必添加額外的步驟。
用關鍵詞compression來指定壓縮濾波器,而濾波器的可選參數使用關鍵詞compression_opt來指定:
>>> dset = f.create_dataset("zipped", (100, 100), compression="gzip")
2) HDF5文件的限制
a. HDF5文件本身大小沒有限制,但是HDF5的一個dataset最高允許32個維,每個維度最多可有2^64個值,每個值大小理論上可以任意大
b. 目前一個chunk允許的最大容量為2^32-1 byte (4GB). 大小固定的dataset的塊的大小不能超過dataset的大小。
6. 參考文獻
【1】 http://docs.h5py.org/en/latest/quick.html
【2】 http://docs.h5py.org/en/latest/high/dataset.html