HDF5文件
在使用Matlab對數(shù)據(jù)進行預處理時堂竟,遇到了內存不足的問題哗戈,因為數(shù)據(jù)量太大郊艘,在處理完成以前內存已經爆滿。如果使用Matlab的.m
文件對文件進行存儲的話,則需要將數(shù)據(jù)分割成多個文件纱注,對后續(xù)的處理造成了不便畏浆。HDF5文件則是一種靈活的文件存儲格式,有一個最大的好處就是在Matlab的處理過程中可以對它進行擴展寫入狞贱,也就是說不是所有數(shù)據(jù)處理完以后一次寫入刻获,而是邊處理邊寫入,極大的降低了對系統(tǒng)內存的要求瞎嬉。
HDF5文件類似與一個文件系統(tǒng)蝎毡,使用這個文件本身就可以對數(shù)據(jù)集(dataset)進行管理。例如下圖所示氧枣,HDF5文件中的數(shù)據(jù)集皆存儲根目錄/
顶掉,在根目錄下存在多個group
,這樣一些group
類似與文件系統(tǒng)的文件夾挑胸,在它們可以存儲別的group
,也可以存儲數(shù)據(jù)集宰闰。
對于每一個dataset 而言茬贵,除了數(shù)據(jù)本身之外,這個數(shù)據(jù)集還會有很多的屬性 attribute,移袍。在hdf5中解藻,還同時支持存儲數(shù)據(jù)集對應的屬性信息,所有的屬性信息的集合就叫做metadata;
使用Matlab操作HDF5文件
使用Matlab創(chuàng)建HDF5文件
使用Matlab創(chuàng)建HDF5文件的函數(shù)是h5create葡盗,使用如下:
h5create(filename,datasetname,[30, 30 , 3, inf],'Datatype','single','ChunkSize',[30,30,3,1000])
filename
為h5
文件的文件名(不知道什么問題螟左,在我的電腦上使用時,這個函數(shù)無法指定路徑)觅够。
datasetname
則為數(shù)據(jù)集的名字胶背,數(shù)據(jù)集名稱必須以/
開頭,比如/G
喘先。
[30,30,3,inf]
位數(shù)據(jù)集的大小钳吟,比如我的數(shù)據(jù)集為30x30
大小的彩色圖像,并且我希望數(shù)量能夠擴展窘拯,那么就可以指定最后以為度為inf红且,以表示數(shù)量不限。
Datatype
為數(shù)據(jù)類型
ChunkSize
為數(shù)據(jù)存儲的最小分塊涤姊,為了讓數(shù)據(jù)能夠具有擴展性暇番,所以為新來的數(shù)據(jù)分配一定的空間大小,對于一個非常大的數(shù)據(jù)思喊,這個值設置大一點比較好壁酬,這樣分塊就會少一點。比如我的數(shù)據(jù)集中,30x30
大小的彩色圖像大概有10萬個左右厨喂,那么1000個存儲在一起較為合適和措,則chunksize
設置為:[30,30,3,1000]。
使用Matlab寫入HDF5
在創(chuàng)建了hdf5文件和數(shù)據(jù)集以后蜕煌,則可以對數(shù)據(jù)集進行寫操作以擴展里面的數(shù)據(jù)派阱。使用Matlab寫入HDF5文件的函數(shù)是h5write,使用如下:
h5write(fileName,datasetName,data,start,count);
fileName
: hdf5文件名
datasetName
:數(shù)據(jù)集名稱斜纪,比如/G
data
:需要寫入的數(shù)據(jù)贫母,數(shù)據(jù)的維度應該與創(chuàng)建時一致,比如盒刚,設置的數(shù)據(jù)集大小為[30,30,3,inf]
腺劣,那么這里的data
的前三個維度就應該是[30, 30, 3]
,而最后一個維度則是自由的
start
:數(shù)據(jù)存儲的起點因块,如果是第一次存橘原,則應該為[1, 1, 1, 1]
(注意數(shù)據(jù)維度的一致性),如果這次存了10000個樣本涡上,也就是[30,30,3,10000]趾断,那么第二次存儲的時候起點就應該為[1,1,1,10001]
count
存儲數(shù)據(jù)的個數(shù),同樣要根據(jù)維度來(其實就是數(shù)據(jù)的維度)吩愧,這里為[30,30,3,10000]
使用Matlab查看HDF5文件信息
Matlab中可以使用h5info函數(shù)來讀取HDF5文件的信息:
fileInfo = h5info(fileName);
然后通過解析fileInfo結構芋酌,則可以得到HDF5文件中的數(shù)據(jù)集名稱、數(shù)據(jù)集大小等等必要信息雁佳。
使用Matlab讀取HDF5中的數(shù)據(jù)集
Matlab中可以使用h5read函數(shù)來讀取HDF5文件:
data = h5read(filename,datasetname,start,count)
filename
:HDF5文件文件名
datasetname
:數(shù)據(jù)集名稱
start
:從數(shù)據(jù)集中取數(shù)據(jù)的其實位置
count
:取的數(shù)據(jù)數(shù)量
還是以上面的30x30的彩色圖像為例脐帝,如果每次需要取1000個,那么第一次取時糖权,start應該設置為[1, 1, 1, 1] 堵腹,count設置為:[30, 30 ,3 1000]。第二次取值時温兼,start則應該設置為[1, 1, 1, 1001]秸滴,count則設置為:[30, 30, 3, 1000]。