HDF5 文件及 h5py

上一篇中我們介紹了 caput 中另一個模塊 miarray 提供的建立在 numpy array 基礎(chǔ)上的并行分布式數(shù)組 MPIArray,其中也提到了 HDF5 文件及其操作,我們將在后面介紹并行分布式的 HDF5 相關(guān)操作,在此之前我們先介紹 HDF5 文件的基本內(nèi)容以及 Python 中操作 HDF5 文件的方法,以為后面的介紹作鋪墊,下面我們介紹 HDF5 文件以及操作 HDF5 文件的 Python 工具 h5py。

HDF5 簡介

HDF(Hierarchical Data Format)指一種為存儲和處理大容量科學數(shù)據(jù)設(shè)計的文件格式及相應(yīng)庫文件。HDF 最早由美國國家超級計算應(yīng)用中心 NCSA 開發(fā),目前在非盈利組織 HDF 小組維護下繼續(xù)發(fā)展。當前流行的版本是 HDF5。HDF5 擁有一系列的優(yōu)異特性,使其特別適合進行大量科學數(shù)據(jù)的存儲和操作,如它支持非常多的數(shù)據(jù)類型,靈活,通用,跨平臺,可擴展,高效的 I/O 性能,支持幾乎無限量(高達 EB)的單文件存儲等,詳見其官方介紹:https://support.hdfgroup.org/HDF5/ 。

Python 中有一系列的工具可以操作和使用 HDF5 數(shù)據(jù),其中最常用的是 h5pyPyTables。我們只介紹 h5py。

h5py

一個 HDF5 文件是存儲兩類對象的容器,這兩類對象分別為:

  • dataset:類似數(shù)組的數(shù)據(jù)集合;
  • gropp;類似目錄的容器,其中可以包含一個或多個 dataset 及其它的 group。

一個 HDF5 文件從一個命名為 "/" 的 group 開始,所有的 dataset 和其它 group 都包含在此 group 下,當操作 HDF5 文件時,如果沒有顯式指定 group 的 dataset 都是默認指 "/" 下的 dataset,另外類似相對文件路徑的 group 名字都是相對于 "/" 的。

HDF5 文件的 dataset 和 group 都可以擁有描述性的元數(shù)據(jù),稱作 attribute。

用 h5py 操作 HDF5 文件,我們可以像使用目錄一樣使用 group,像使用 numpy 數(shù)組一樣使用 dataset,像使用字典一樣使用屬性,非常方便和易用。

安裝

如果僅僅想簡單的使用 h5py 來操作 HDF5(無并行支持和其它定制特性),安裝 h5py 是非常簡單的,可以使用 conda 或者 pip 直接安裝:

$ conda install h5py

或者

$ pip install h5py

在后面我們將會介紹結(jié)合 mi4py 和 h5py 進行并行的HDF5 操作,因此下面介紹如何編譯和安裝支持并行操作的 HDF5 庫和 h5py 軟件包。

https://support.hdfgroup.org/downloads/index.html 下載 HDF5 軟件,解壓后進入頂層目錄。編譯并行 HDF5 需要用到一個支持并行的編譯器,如 mpicc (安裝了 OpenMP 或 MPICH 后都有),通過在終端中輸入

$ which mpicc

得到 mpicc 的路徑,然后按照下列步驟進行編譯和安裝:

$ CC=/path/to/your/mpicc ./configure --enable-parallel --enable-shared --prefix=<install-directory>
$ make      # build the library
$ make check    # verify the correctness
$ make install

安裝完并行的 HDF5 后,從 https://pypi.org/project/h5py/#files 下載 h5py 安裝包并解壓,在其頂層目錄執(zhí)行以下命令編譯和安裝:

$ export CC=mpicc
$ python setup.py configure --mpi [--hdf5=/path/to/parallel/hdf5]
$ python setup.py build
$ python setup.py install

使用

下面我們只簡要介紹 h5py 的基本操作,并行的 h5py 操作會在下一篇中介紹。更詳細的內(nèi)容可參考 h5py 的文檔。

打開/創(chuàng)建文件

class File(name, mode=None, driver=None, libver=None, userblock_size=None, **kwds)

打開或創(chuàng)建一個 HDF5 文件,name 為文件名字符串,mode 為打開文件的模式,driver 可以指定一種驅(qū)動方式,如需進行并行 HDF5 操作,可設(shè)置為 'mpio',libver 可以指定使用的兼容版本,默認為 'earliest',也可以指定為 'latest',userblock_size 以字節(jié)為單位指定一個在文件開頭稱作 user block 的數(shù)據(jù)塊,一般不需要設(shè)置。返回所打開文件的句柄。

有效的 mode 參數(shù)有:

mode 說明
r 只讀,文件必須存在
r+ 讀寫,文件必須存在
w 創(chuàng)建新文件寫,已經(jīng)存在的文件會被覆蓋掉
w- / x 創(chuàng)建新文件寫,文件如果已經(jīng)存在則出錯
a 打開已經(jīng)存在的文件進行讀寫,如果不存在則創(chuàng)建一個新文件讀寫,此為默認的 mode

創(chuàng)建 group

create_group(self, name, track_order=False)

創(chuàng)建一個新的 group。以類似目錄路徑的形式指明所創(chuàng)建 group 的名字 name,如果 track_order 為 True,則會跟蹤在當前 group 下的 group 和 dataset 創(chuàng)建的先后順序。該方法可以在打開的文件句柄(相當于 "/" group)或者一個存在的 group 對象上調(diào)用,此時 name 的相對路徑就是相對于此 group 的。

創(chuàng)建 dataset

create_dataset(self, name, shape=None, dtype=None, data=None, **kwds)

創(chuàng)建一個新的 dataset。以類似文件路徑的形式指明所創(chuàng)建 dataset 的名字 name,shape 以一個 tuple 或 list 的形式指明創(chuàng)建 dataset 的 shape,用 "()" 指明標量數(shù)據(jù)的 shape,dtype 指明所創(chuàng)建 dataset 的數(shù)據(jù)類型,可以為 numpy dtype 或者一個表明數(shù)據(jù)類型的字符串,data 指明存儲到所創(chuàng)建的 dataset 中的數(shù)據(jù)。如果 data 為 None,則會創(chuàng)建一個空的 dataset,此時 shapedtype 必須設(shè)置;如果 data 不為 None,則 shapedtype 可以不設(shè)置而使用 data 的 shape 和 dtype,但是如果設(shè)置的話,必須與 data 的 shape 和 dtype 兼容。

創(chuàng)建 attribute

打開的文件句柄(相當于 "/" group),group 和 dataset 上都可以創(chuàng)建 attribute,以類似于字典的操作方式創(chuàng)建和讀取 attribute。

例程

下面給出 h5py 的簡單使用例程。

# h5py_demo.py

"""
Demonstrates how to use h5py.

Run this like:
$ python h5py_demo.py
"""

import os
import numpy as np
import h5py

file_name = 'test.hdf5'
# create a new HDF5 file
f = h5py.File(file_name)
# create a new group
f.create_group('/grp1') # or f.create_group('grp1')
# create a nother group inside grp1
f.create_group('/grp1/grp2') # or f.create_group('grp1/grp2')
# create a dataset in group "/"
data = np.arange(6).reshape(2, 3)
f.create_dataset('dset1', data=data) # or f.create_dataset('/dset1', data=data)
# create another dataset in group /grp1
f.create_dataset('grp1/dset2', data=data) # or f.create_dataset('/grp1/dset2', data=data)
# create an attribute of "/"
f.attrs['a'] = 1 # or f.attrs['/a'] = 1
# create an attribute of group "/grp1"
f['grp1'].attrs['b'] = 'xyz'
# create an attribute of dataset "/grp1/dset2"
f['grp1/dset2'].attrs['c'] = np.array([1, 2])
# close file
f.close()

# open the existing test.hdf5 for read only
f = h5py.File(file_name, 'r')
# read dataset /dset1
print '/dset1 = %s' % f['dset1'][:]
# read dataset /grp1/dset2
print '/grp1/dset2 = %s' % f['/grp1/dset2'][:]
# get attributes
print f.attrs['a']
print f['grp1'].attrs['b']
print f['grp1/dset2'].attrs['c']

# remove the created file
os.remove(file_name)

運行結(jié)果如下:

$ python h5py_demo.py
/dset1 = [[0 1 2]
[3 4 5]]
/grp1/dset2 = [[0 1 2]
[3 4 5]]
1
xyz
[1 2]

以上我們簡要介紹了 HDF5 和 h5py 的基本操作,在下一篇中我們將介紹利用 mpi4py 和 h5py 進行并行分布式的 HDF5 操作。

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

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

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