合并大量HDF5文件

11

我有大约500个HDF5文件,每个文件大小约为1.5 GB。

这些文件都具有相同的结构,包含7个复合(int,double,double)数据集和可变数量的样本。

现在,我想通过连接每个数据集来连接所有这些文件,以便最终获得一个带有我的7个数据集的单个750 GB文件。

目前,我正在运行h5py脚本,它:

  • 创建带有正确数据集的HDF5文件,最大为无限
  • 按顺序打开所有文件
  • 检查样本数(因为它是可变的)
  • 调整全局文件大小
  • 追加数据

这显然需要很多小时,您有关于改进此过程的建议吗?

我正在使用群集,因此可以并行使用HDF5,但我不擅长C编程,无法自己实现工具,我需要已经编写好的工具。


@sarnold 我正在NERSC的hopper上工作,理论I/O速度为25 GB/s,而且文件系统完全并行,并支持MPI I/O。 - Andrea Zonca
安德里亚,我无言以对。我想到了一系列优秀的驱动器,但仍然无法超过每秒一千兆字节... - sarnold
2
Hdf5的一个特性是可以在主文件的“文件夹”中“挂载”多个子文件。这样就不需要将它们全部合并成一个文件。请参见此处:http://davis.lbl.gov/Manuals/HDF5-1.4.3/Tutor/mount.html - schoetbi
@AndreaZonca,您能否请提供一份此脚本的副本?我目前正在尝试做类似的事情,这听起来会非常有帮助。 - okarin
1
请查看此代码片段:https://gist.github.com/zonca/8e0dda9d246297616de9 - Andrea Zonca
显示剩余3条评论
3个回答

9
我发现大部分时间都花在了调整文件大小上,因为我每一步都在调整大小,所以现在我先遍历所有文件并获取它们的长度(长度是可变的)。
然后我创建全局 h5 文件,并将总长度设置为所有文件的长度之和。
仅在这个阶段完成后,我才使用所有小文件中的数据填充 h5 文件。
现在每个文件只需约 10 秒钟,所以应该不到 2 小时即可完成,而以前需要更长时间。

1
Ashley的回答对我很有帮助。以下是在Julia中实现她的建议:

在bash中创建列出要连接的文件的文本文件:

ls -rt $somedirectory/$somerootfilename-*.hdf5 >> listofHDF5files.txt

编写一个Julia脚本,将多个文件合并成一个文件:
# concatenate_HDF5.jl
using HDF5

inputfilepath=ARGS[1]
outputfilepath=ARGS[2]

f = open(inputfilepath)
firstit=true
data=[]
for line in eachline(f)
    r = strip(line, ['\n'])
    print(r,"\n")
    datai = h5read(r, "/data")
    if (firstit)
        data=datai
        firstit=false
    else
        data=cat(4,data, datai) #In this case concatenating on 4th dimension
    end
end
h5write(outputfilepath, "/data", data)

然后使用以下命令执行上面的脚本文件:

julia concatenate_HDF5.jl listofHDF5files.txt final_concatenated_HDF5.hdf5

1
我知道回答这个问题会让我获得一个“僵尸贴勋章”,但是最近我在这方面有所进展。
在Julia中,这只需要几秒钟的时间。
1.创建一个txt文件,列出所有的hdf5文件路径(如果有很多,可以使用bash一次性完成)。
2.在循环中读取txt文件的每一行,并使用label$i = h5read(original_filepath$i, "/label")
3.将所有标签连接起来:label = [label label$i] 4.然后只需写入:h5write(data_file_path, "/label", label) 如果您有组或更复杂的hdf5文件,也可以执行相同的操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接