在上一篇中我们介绍了利用 mpi4py 和 h5py 进行并行分布式的 HDF5 文件操作,下面我们将介绍 caput 中的 memh5 模块,其中提供若干功能强大的工具可以使我们在内存中操作与 HDF5 文件类似的数据结构,并提供该数据结构到磁盘中 HDF5 文件之间的映射,当然这些操作都是可以并行分布式地进行的。
类及操作方法
能够一致地操作无论是内存中还是磁盘上文件中的数据在某些情况下是非常有用的,而且也能为我们的编程带来很大的方便。我们前面介绍的 HDF5 文件是一种非常强大的科学数据文件存储格式,其 Python 操作工具 h5py 使我们能够非常方便地使用 HDF5 文件及操作其中存放的数据,结合 mpi4py 还能进行并行分布式的 HDF5 文件操作。但是作为一种文件格式,HDF5 文件及其中存放的数据是存在于磁盘中的,用 h5py 对其进行操作时,其中存放的数据(包括 dataset 和 attribute)一般读取到内存后会成为一个个独立的数据项,比如说 numpy 数组,数字,字符串等,从而失去其在原文件中的组织形式和等级结构。内存中的这些数据项的操作方式和 h5py 提供的对 HDF5 文件的操作方式并不一致,这给我们带来很多不便。如果能够将 HDF5 文件中的数据保持其在原文件中的组织形式和等级结构复制到内存中,建立一个内存中的数据到原文件中的数据的映射,并提供一套与 HDF5 文件操作一致的方法来操作内存中的数据映像,必然给我们的编程带来莫大的方便,也使得 HDF5 文件及其数据更加易用。幸运的是,caput 中的 memh5 模块给我们提供了这些工具,下面给出其提供的主要功能及其方法接口。
MemGroup
内存中的 group 实现,对应于 h5py 中的 Group。
class MemGroup(distributed=False, comm=None)
创建一个 MemGroup 对象,如果 distributed
为 True,且 comm
为一个有效的通信子对象,则可以在其中创建分布式的 MemDatasetDistributed (见下面的介绍)。在 mpi4py 可用的情况下,如果 comm = None
, 则会使用 MPI.COMM_WORLD。
除了与 h5py.Group 一致的方法外,MemGroup 提供以下额外的或不同的方法接口:
from_group(cls, group)
深复制 group
而创建一个 MemGroup。group
可以为一个 MemGroup 或者 h5py.Group (包括 h5py.File,也即其 “/” group) 对象。
from_hdf5(cls, filename, distributed=False, hints=True, comm=None, **kwargs)
读取整个 HDF5 文件来创建一个 MemGroup。filename
为 HDF5 文件名,distributed
指明是否创建一个分布式的 MemGroup,即其中可以包含一些 MemDatasetDistributed,如果 distributed
为 True,hints
为 True,且 comm
是一个有效的通信子对象,则会根据文件中 dataset 的 ‘__memh5_distributed_dset’ 属性(如果存在且为 True)将该 dataset 读取到内存中创建为一个 MemDatasetDistributed,其它的 dataset 则读取到内存后被创建为 MemDatasetCommon。
to_hdf5(self, filename, hints=True, **kwargs)
将该 MemGroup 中的数据按照其组织形式及等级结构写入到一个 HDF5 文件 filename
中,hints
以指明是否在文件中标注哪些 dataset 是由该 MemGroup 中的 MemDatasetDistributed 所存储,以变于 from_hdf5 方法可将其恢复为 MemDatasetDistributed。</