Matlab 操作 HDF5文件

HDF5文件

在使用Matlab對數(shù)據(jù)進(jìn)行預(yù)處理時,遇到了內(nèi)存不足的問題,因?yàn)閿?shù)據(jù)量太大,在處理完成以前內(nèi)存已經(jīng)爆滿。如果使用Matlab的.m文件對文件進(jìn)行存儲的話,則需要將數(shù)據(jù)分割成多個文件,對后續(xù)的處理造成了不便。HDF5文件則是一種靈活的文件存儲格式,有一個最大的好處就是在Matlab的處理過程中可以對它進(jìn)行擴(kuò)展寫入,也就是說不是所有數(shù)據(jù)處理完以后一次寫入,而是邊處理邊寫入,極大的降低了對系統(tǒng)內(nèi)存的要求。

HDF5文件類似與一個文件系統(tǒng),使用這個文件本身就可以對數(shù)據(jù)集(dataset)進(jìn)行管理。例如下圖所示,HDF5文件中的數(shù)據(jù)集皆存儲根目錄/,在根目錄下存在多個group,這樣一些group類似與文件系統(tǒng)的文件夾,在它們可以存儲別的group,也可以存儲數(shù)據(jù)集。

HDF5文件格式

對于每一個dataset 而言,除了數(shù)據(jù)本身之外,這個數(shù)據(jù)集還會有很多的屬性 attribute,。在hdf5中,還同時支持存儲數(shù)據(jù)集對應(yīng)的屬性信息,所有的屬性信息的集合就叫做metadata;

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])

filenameh5文件的文件名(不知道什么問題,在我的電腦上使用時,這個函數(shù)無法指定路徑)。
datasetname則為數(shù)據(jù)集的名字,數(shù)據(jù)集名稱必須以/開頭,比如/G。
[30,30,3,inf]位數(shù)據(jù)集的大小,比如我的數(shù)據(jù)集為30x30大小的彩色圖像,并且我希望數(shù)量能夠擴(kuò)展,那么就可以指定最后以為度為inf,以表示數(shù)量不限。
Datatype為數(shù)據(jù)類型
ChunkSize為數(shù)據(jù)存儲的最小分塊,為了讓數(shù)據(jù)能夠具有擴(kuò)展性,所以為新來的數(shù)據(jù)分配一定的空間大小,對于一個非常大的數(shù)據(jù),這個值設(shè)置大一點(diǎn)比較好,這樣分塊就會少一點(diǎn)。比如我的數(shù)據(jù)集中,30x30大小的彩色圖像大概有10萬個左右,那么1000個存儲在一起較為合適,則chunksize設(shè)置為:[30,30,3,1000]。

使用Matlab寫入HDF5

在創(chuàng)建了hdf5文件和數(shù)據(jù)集以后,則可以對數(shù)據(jù)集進(jìn)行寫操作以擴(kuò)展里面的數(shù)據(jù)。使用Matlab寫入HDF5文件的函數(shù)是h5write,使用如下:

h5write(fileName,datasetName,data,start,count);

fileName: hdf5文件名
datasetName:數(shù)據(jù)集名稱,比如/G
data:需要寫入的數(shù)據(jù),數(shù)據(jù)的維度應(yīng)該與創(chuàng)建時一致,比如,設(shè)置的數(shù)據(jù)集大小為[30,30,3,inf],那么這里的data的前三個維度就應(yīng)該是[30, 30, 3],而最后一個維度則是自由的
start:數(shù)據(jù)存儲的起點(diǎn),如果是第一次存,則應(yīng)該為[1, 1, 1, 1](注意數(shù)據(jù)維度的一致性),如果這次存了10000個樣本,也就是[30,30,3,10000],那么第二次存儲的時候起點(diǎn)就應(yīng)該為[1,1,1,10001]
count存儲數(shù)據(jù)的個數(shù),同樣要根據(jù)維度來(其實(shí)就是數(shù)據(jù)的維度),這里為[30,30,3,10000]

使用Matlab查看HDF5文件信息

Matlab中可以使用h5info函數(shù)來讀取HDF5文件的信息:

fileInfo = h5info(fileName);

然后通過解析fileInfo結(jié)構(gòu),則可以得到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ù)的其實(shí)位置
count:取的數(shù)據(jù)數(shù)量
還是以上面的30x30的彩色圖像為例,如果每次需要取1000個,那么第一次取時,start應(yīng)該設(shè)置為[1, 1, 1, 1] ,count設(shè)置為:[30, 30 ,3 1000]。第二次取值時,start則應(yīng)該設(shè)置為[1, 1, 1, 1001],count則設(shè)置為:[30, 30, 3, 1000]。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,094評論 25 709
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,578評論 19 139
  • 你要明白愛情是建立在物質(zhì)上的。 我愛你是因?yàn)槟隳芙o我想要的。 所有人都喜歡安逸。 所以你要時刻告誡自己。你要為那愛...
    煙酒大叔閱讀 262評論 1 3
  • 孤獨(dú)是一只小船, 它總是喜歡獨(dú)自一只 在那溪流上漂浮。 有一只蝴蝶看見它了, 停留在它的船檐。 “我能和你做朋友嗎...
    嘉魚哇閱讀 398評論 2 1
  • 昨天是2015年9月2日,到達(dá)廣州的第一天。飛機(jī)落地那一瞬間,地鐵馳騁過程中,輪船靠岸那一刻,找尋B家的路上,我依...
    花殘閱讀 394評論 0 1

友情鏈接更多精彩內(nèi)容