《Python和HDF 5大数据应用》——2.4 你的第一个HDF5文件
本節書摘來自異步社區《Python和HDF 5大數據應用》一書中的第2章,第2.4節,作者[美]Andrew Collette(科萊特),胡世杰 譯,更多章節內容可以訪問云棲社區“異步社區”公眾號查看。
2.4 你的第一個HDF5文件
在我們研究組和數據集之前,讓我們先看一下File對象能做些什么,來作為你進入HDF5世界的起點。
這里有一個最簡單的使用HDF5的程序:
File對象是你的起點。它提供方法使你能夠在文件內創建新的數據集或組,另外還有一些一目了然的屬性如.filename和.mode等。
說到.mode,HDF5文件支持Python對普通文件的讀寫模式:
還有一個額外的HDF5專有模式用于保護你不會意外覆蓋某個已存在的文件:
如果一個同名文件已經存在則該函數會失敗,否則會創建一個新文件。如果你需要長期運行一個計算程序而且不希望當腳本第二次運行時覆蓋你已有的輸出文件,你可以用w-模式打開它:
另外,你可以隨意使用Unicode文件名!假設你的操作系統支持UTF-8編碼,你只需提供一個普通的Unicode字符串:
提示
你可能在想如果你的程序在打開文件時崩潰會怎樣。如果你的程序拋出Python異常,別擔心!HDF庫會在程序退出時自動幫你關閉所有打開的文件。2.4.1 使用環境管理器
Python 2.6的最酷特性之一是支持了環境管理器。環境管理器通過with語句使用,它們是一些具有特殊方法的對象,這些特殊方法在進入和離開代碼塊時被調用。下面這個經典的例子使用了Python內建的file對象:
上面的代碼打開的全新的file對象僅在f代碼塊中有效。當f退出時文件被自動關閉(哪怕拋出了異常!)。
h5py.File對象完全支持這種用法。這可以確保文件總是能被正確地關閉,而不需要把所有的代碼包含在try/except塊中:
2.4.2 文件驅動
文件驅動處于文件系統和HDF5高級抽象(組、數據集和特征)之間。它們處理HDF5地址空間到磁盤上的字節之間的映射關系。一般情況下你無需擔心當前使用了哪個驅動,因為默認的驅動適用于大部分的應用程序。
一旦文件被打開,驅動模塊就完全透明了。你只需要跟HDF5庫打交道,驅動會幫你處理底層存儲。
下面是一些比較有意思的驅動,可以幫助你解決一些不常見的問題。
1.core驅動
core驅動會將你的文件整個保存在內存中。它對于你能夠存儲的數據量顯然是有限制的,帶來的好處則是超快速的讀寫。當你需要以內存級的高速來訪問HDF5結構時,這是一個很好的選擇。你可以將driver關鍵字設為“core”來開啟這個驅動:
你還可以要求HDF5在磁盤上創建一個“備份存儲”文件,當內存中的文件映象被關閉時,其內容會被保存到磁盤上:
另外,backing_store關鍵字同時也告訴HDF5在打開文件時從磁盤讀取已存在的文件。所以只要整個文件都能被放入內存,那么你只需要對磁盤文件讀寫各一次。像數據集的讀寫、特征的創建等操作都完全不會占用磁盤I/O。
2.family驅動
有時候你會需要將一個大文件分成多個大小一致的文件,這個功能最初是為了支持那些不能處理2GB以上文件的文件系統。
由于歷史上的原因,默認的memb_size是231?1。
3.mpio驅動
這個驅動是并發HDF5的核心。它允許多個同時運行的進程訪問同一個文件。你可以同時有成百上千個并發計算的進程,它們在共享訪問磁盤上同一個文件時能保證數據的一致性。
使用mpio驅動需要一些技巧。第9章會詳細介紹該驅動以及在并發環境下使用HDF5的最佳實踐。
2.4.3 用戶塊
HDF5一個有意思的特性是文件內容可以被任意用戶數據占用。當一個文件被打開時,HDF5庫會在文件最開頭搜索HDF5頭部,然后是前512字節,前1024字節這樣以2的指數遞增。這種處于文件開頭的數據被稱為用戶塊,你可以在用戶塊里放任何你需要的數據。
唯一的限制是塊的大小(必須是2的指數且最小512),而且當你往用戶塊內寫入數據時,記得要先在HDF5中關閉該文件,示例如下:
接下來我們將要看到的是NumPy用戶非常熟悉的數組類型,同時也是HDF5數據模型中的第一個主要對象:數據集。
總結
以上是生活随笔為你收集整理的《Python和HDF 5大数据应用》——2.4 你的第一个HDF5文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《程序员的修炼——从优秀到卓越》一一1.
- 下一篇: 《CCNP安全Secure 642-63