添加存储在 HDF5 数据集中的大矩阵

Adding big matrices stored in HDF5 datasets

我有两个具有相同结构的 HDF5 文件,每个文件都存储一个相同形状的矩阵。我需要创建第三个 HDF5 文件,其中包含一个表示上述两个矩阵的元素总和的矩阵。鉴于矩阵的大小非常大(在 Gb-Tb 范围内),最好的方法是什么,最好是以并行方式?我正在使用 HDF5 库的 h5py 接口。是否有任何图书馆能够做到这一点?

是的,这是可能的。关键是从 file1 和 file2 访问数据切片,进行元素求和,然后将该新数据切片写入 file3。您可以使用 h5py 或 PyTables(又名表格)来执行此操作。不需要其他库。我只了解并行计算。我知道 h5py 通过 mpi4py Python 包支持 mpi 接口。详情在这里:h5py docs: Parallel HDF5

这是一个简单的例子。它使用随机浮点数的数据集创建 2 个文件,shape=(10,10,10)。然后它会创建一个具有相同形状的空数据集的新文件。该循环从 file1 和 file2 中读取数据切片,对它们求和,然后写入 file3 中的同一切片。要使用大数据进行测试,您可以修改形状以匹配您的文件。
2021 年 1 月 21 日更新:
我添加了代码以从 file1 和 file2 获取数据集形状,并比较它们(以确保它们相等)。如果形状不相等,我退出。如果它们匹配,我创建新文件,然后创建匹配形状的数据集。 (如果你真的想变得健壮,你可以对 dtype 做同样的事情。)我还使用 shape[2] 的值作为数据集上的切片迭代器。

import h5py
import numpy as np
import random
import sys

arr = np.random.random(10**3).reshape(10,10,10)
with h5py.File('file1.h5','w') as h5fw :
    h5fw.create_dataset('data_1',data=arr)

arr = np.random.random(10**3).reshape(10,10,10)
with h5py.File('file2.h5','w') as h5fw :
    h5fw.create_dataset('data_2',data=arr)

h5fr1 = h5py.File('file1.h5','r')
f1shape = h5fr1['data_1'].shape
h5fr2 = h5py.File('file2.h5','r')
f2shape = h5fr2['data_2'].shape

if (f1shape!=f2shape):
    print ('Datasets shapes do not match')
    h5fr1.close()
    h5fr2.close()
    sys.exit('Exiting due to error.') 
         
else:
    with h5py.File('file3.h5','w') as h5fw :
        ds3 = h5fw.create_dataset('data_3', shape=f1shape, dtype='f')
    
        for i in range(f1shape[2]):
            arr1_slice = h5fr1['data_1'][:,:,i]
            arr2_slice = h5fr2['data_2'][:,:,i]
            arr3_slice = arr1_slice + arr2_slice
            ds3[:,:,i] = arr3_slice
        
        #     alternately, you can slice and sum in 1 line
        #     ds3[:,:,i] = h5fr1['data_1'][:,:,i] + \
        #                  h5fr2['data_2'][:,:,i]    
            
    print ('Done.')

h5fr1.close()
h5fr2.close()