網站首頁 編程語言 正文
HDF5文件
在使用Matlab對數據進行預處理時,遇到了內存不足的問題,因為數據量太大,在處理完成以前內存已經爆滿。如果使用Matlab的.m
文件對文件進行存儲的話,則需要將數據分割成多個文件,對后續的處理造成了不便。HDF5文件則是一種靈活的文件存儲格式,有一個最大的好處就是在Matlab的處理過程中可以對它進行擴展寫入,也就是說不是所有數據處理完以后一次寫入,而是邊處理邊寫入,極大的降低了對系統內存的要求。
HDF5文件類似與一個文件系統,使用這個文件本身就可以對數據集(dataset)進行管理。例如下圖所示,HDF5文件中的數據集皆存儲根目錄/
,在根目錄下存在多個group
,這樣一些group
類似與文件系統的文件夾,在它們可以存儲別的group
,也可以存儲數據集。
對于每一個dataset 而言,除了數據本身之外,這個數據集還會有很多的屬性 attribute,。在hdf5中,還同時支持存儲數據集對應的屬性信息,所有的屬性信息的集合就叫做metadata;
使用Matlab操作HDF5文件
使用Matlab創建HDF5文件
使用Matlab創建HDF5文件的函數是h5create,使用如下:
h5create(filename,datasetname,[30, 30 , 3, inf],'Datatype','single','ChunkSize',[30,30,3,1000])
filename
為h5
文件的文件名(不知道什么問題,在我的電腦上使用時,這個函數無法指定路徑)。
datasetname
則為數據集的名字,數據集名稱必須以/
開頭,比如/G
。
[30,30,3,inf]
位數據集的大小,比如我的數據集為30x30
大小的彩色圖像,并且我希望數量能夠擴展,那么就可以指定最后以為度為inf,以表示數量不限。
Datatype
為數據類型
ChunkSize
為數據存儲的最小分塊,為了讓數據能夠具有擴展性,所以為新來的數據分配一定的空間大小,對于一個非常大的數據,這個值設置大一點比較好,這樣分塊就會少一點。比如我的數據集中,30x30
大小的彩色圖像大概有10萬個左右,那么1000個存儲在一起較為合適,則chunksize
設置為:[30,30,3,1000]。
使用Matlab寫入HDF5
在創建了hdf5文件和數據集以后,則可以對數據集進行寫操作以擴展里面的數據。使用Matlab寫入HDF5文件的函數是h5write,使用如下:
h5write(fileName,datasetName,data,start,count);
fileName
: hdf5文件名
datasetName
:數據集名稱,比如/G
data
:需要寫入的數據,數據的維度應該與創建時一致,比如,設置的數據集大小為[30,30,3,inf]
,那么這里的data
的前三個維度就應該是[30, 30, 3]
,而最后一個維度則是自由的
start
:數據存儲的起點,如果是第一次存,則應該為[1, 1, 1, 1]
(注意數據維度的一致性),如果這次存了10000個樣本,也就是[30,30,3,10000],那么第二次存儲的時候起點就應該為[1,1,1,10001]
count
存儲數據的個數,同樣要根據維度來(其實就是數據的維度),這里為[30,30,3,10000]
使用Matlab查看HDF5文件信息
Matlab中可以使用h5info函數來讀取HDF5文件的信息:
fileInfo = h5info(fileName);
然后通過解析fileInfo結構,則可以得到HDF5文件中的數據集名稱、數據集大小等等必要信息。
使用Matlab讀取HDF5中的數據集
Matlab中可以使用h5read函數來讀取HDF5文件:
data = h5read(filename,datasetname,start,count)
filename
:HDF5文件文件名
datasetname
:數據集名稱
start
:從數據集中取數據的其實位置
count
:取的數據數量
還是以上面的30x30的彩色圖像為例,如果每次需要取1000個,那么第一次取時,start應該設置為[1, 1, 1, 1] ,count設置為:[30, 30 ,3 1000]。第二次取值時,start則應該設置為[1, 1, 1, 1001],count則設置為:[30, 30, 3, 1000]。
原文鏈接:https://www.jianshu.com/p/fc144bae3734
相關推薦
- 2023-05-16 golang-gorm自動建表問題_Golang
- 2022-04-24 python文件與路徑管理方法_python
- 2022-12-26 React?tabIndex使非表單元素支持focus和blur事件_React
- 2022-06-02 python獲取字符串中的email_python
- 2022-11-26 Ubuntu?環境下安裝?Docker環境詳解_docker
- 2022-09-25 將rosbag中的imu數據轉成txt文件
- 2023-01-17 python?PyQt5(自定義)信號與槽使用及說明_python
- 2022-06-29 Python使用scipy進行曲線擬合的方法實例_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支