并行 HDF5 和 h5py

上一篇中我们简要介绍了 HDF5 和 h5py 的基本操作,下面我们将介绍利用 mpi4py 和 h5py 进行并行分布式的 HDF5 文件操作。

使用 mpi4py 进行一般并行文件操作在前面已经作了相应的介绍,并行 HDF5 文件的相关操作在很多方面是与一般的并行文件操作相同或满足相似的约束条件。但是如果使用 mpi4py 和 h5py 进行并行 HDF5 文件操作,则 HDF5 文件的很多并行操作细节对使用者来说是透明的,无需用户关心,因此大大降低了并行 HDF5 文件操作的难度。

使用 h5py 进行并行 HDF5 操作

要并行地打开/创建一个 HDF5 文件,可以使用上一篇介绍的方法并且设置参数 driver 为 'mpio' 及 comm 为一个有效的通信子对象。

注意打开/创建文件是一个集合操作,通信子对象上的所有进程必须同时参与。

打开文件后就可以执行并行的文件读写操作,如创建 group,创建/读取 dataset,设置/读取 attribute 等,但是需要注意和区分两类操作方法:集合操作和独立操作。任何涉及改动文件结构和文件元数据的操作都必须是集合操作(即通信子对象上的所有进程必须同时参与),如创建 group,创建dataset,设置 attribute 等,但是每个进程可以独立地向已经存在的 dataset 中写入数据,或者从其中读取数据。

从版本 1.8.9+ 开始,HDF5 支持原子操作模式,原子模式可以更严格的方式保证文件操作的一致性。并行文件操作的原子性和一致性在前面的访问文件数据方法中作了相应的介绍。要在 h5py 中打开原子操作模式,只需设置文件操作句柄的 atomic 属性为 True。

例程

下面给出使用 h5py 进行并行 HDF5 操作的使用例程。

# parallel_h5.py

"""
Demonstrates how to use parallel HDF5 with h5py.

Run this with 4 processes like:
$ mpiexec -n 4 python h5py_demo.py
"""

import os
import numpy as np
import h5py
from mpi4py import MPI


comm = MPI.COMM_WORLD
rank = comm.rank
size = comm.size

N = 10
# N = 2**29

file_name = 'test.hdf5'
# create a new HDF5 file collectively
f = h5py.File(file_name, driver='mpio', comm=comm)
# use atomic mode
f.atomic = True
# create a new group collectively
f.create_group('grp')
# create a empty dataset in group "/grp" collectively
f.create_dataset('grp/dset', shape=(size, N), dtype=np.int32)
# set an attribute of the dataset grp/dset collectively
f['grp/dset'].attrs['a'] = 1

data = np.arange(N, dtype=np.int32)
# write data to dataset grp/dset
f['grp/dset'][rank, :] = data
# rank 0 changes a slice of the dataset individually
if rank == 0:
    f['grp/dset'][1, :] += data
# synchronize here
comm.Barrier()
# rank 2 reads the changed slice
if rank == 2:
    print f['grp/dset'][1, :]
# read the attrs
if rank == 1:
    print f['grp/dset'].attrs['a']

# close file collectively
f.close()

# remove the created file
if rank == 0:
    os.remove(file_name)

运行结果如下:

$ mpiexec -n 4 python parallel_h5.py
[ 0  2  4  6  8 10 12 14 16 18]
1

2 GB dataset 限制

以上的例程运行正常,但是当我们将 N 设置成 229 或更大,这样每个进程将要写入文件的数据 ≥ 2 GB,则执行结果会如下:

$ mpiexec -n 4 python parallel_h5.py
Traceback (most recent call last):
File "parallel_h5.py", line 37, in <module>
    f['grp/dset'][rank, :] = data
File "/opt/python-2.7.5-mkl/lib/python2.7/site-packages/h5py/_hl/dataset.py", line 551, in __setitem__
    self.id.write(mspace, fspace, val, mtype)
File "h5d.pyx", line 217, in h5py.h5d.DatasetID.write (h5py/h5d.c:3225)
Traceback (most recent call last):
File "parallel_h5.py", line 37, in <module>
    f['grp/dset'][rank, :] = data
File "/opt/python-2.7.5-mkl/lib/python2.7/site-packages/h5py/_hl/dataset.py", line 551, in __setitem__
Traceback (most recent call last):
File "parallel_h5.py", line 37, in <module>
    self.id.write(mspace, fspace, val, mtype)
File "h5d.pyx", line 217, in h5py.h5d.DatasetID.write (h5py/h5d.c:3225)
    f['grp/dset'][rank, :] = data
File "/opt/python-2.7.5-mkl/lib/python2.7/site-packages/h5py/_hl/dataset.py", line 551, in __setitem__
    self.id.write(mspace, fspace, val, mtype)
File "h5d.pyx", line 217, in h5py.h5d.DatasetID.write (h5py/h5d.c:3225)
Traceback (most recent call last):
File "parallel_h5.py", line 37, in <module>
    f['grp/dset'][rank, :] = data
File "/opt/python-2.7.5-mkl/lib/python2.7/site-packages/h5py/_hl/dataset.py", line 551, in __setitem__
    self.id.write(mspace, fspace, val, mtype)
File "h5d.pyx", line 217, in h5py.h5d.DatasetID.write (h5py/h5d.c:3225)
File "_proxy.pyx", line 120, in h5py._proxy.dset_rw (h5py/_proxy.c:1793)
File "_proxy.pyx", line 120, in h5py._proxy.dset_rw (h5py/_proxy.c:1793)
File "_proxy.pyx", line 120, in h5py._proxy.dset_rw (h5py/_proxy.c:1793)
File "_proxy.pyx", line 120, in h5py._proxy.dset_rw (h5py/_proxy.c:1793)
File "_proxy.pyx", line 93, in h5py._proxy.H5PY_H5Dwrite (h5py/_proxy.c:1603)
File "_proxy.pyx", line 93, in h5py._proxy.H5PY_H5Dwrite (h5py/_proxy.c:1603)
File "_proxy.pyx", line 93, in h5py._proxy.H5PY_H5Dwrite (h5py/_proxy.c:1603)
File "_proxy.pyx", line 93, in h5py._proxy.H5PY_H5Dwrite (h5py/_proxy.c:1603)
IOError: can't prepare for writing data (Dataset: Write failed)
IOError: can't prepare for writing data (Dataset: Write failed)
IOError: can't prepare for writing data (Dataset: Write failed)
IOError: can't prepare for writing data (Dataset: Write failed)

程序运行出错,这是因为并行 HDF5 文件的读写操作单个进程一次操作的数据量有 2 GB 的大小限制,超过 2 GB 就会出错。其实这并不是并行 HDF5 本身的问题,更不是 h5py 的问题,而是 MPI 的问题,更准确地说是 MPI 的并行 I/O 操作工具 ROMIO 的问题(ROMPIO 是目前几乎所有 MPI 实现的默认或唯一并行 I/O 工具)。ROMIO 的绝大部分 I/O 操作单次允许操作的数据量都限制在 2 GB 之内,所以除非在将来改进 ROMIO,这一限制会一直存在。所以我们在进行并行 HDF5 操作时,应该注意单次读写的数据量不要超过 2 GB,如果要读写超过 2 GB 的数据,可以利用类似 numpy 数组切片的功能进行多次操作。

以上我们介绍了利用 mpi4py 和 h5py 进行并行分布式的 HDF5 文件操作,在下一篇中我们将介绍 caput 中的 memh5 模块,其中提供若干功能强大的工具可以使我们在内存中操作与 HDF5 文件类似的数据结构,并提供该数据结构到磁盘中 HDF5 文件之间的映射,当然这些操作都是可以并行分布式地进行的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269