连接大量 HDF5 文件

Posted

技术标签:

【中文标题】连接大量 HDF5 文件【英文标题】:Concatenate a large number of HDF5 files 【发布时间】:2011-07-17 19:46:52 【问题描述】:

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

每个文件都有完全相同的结构,即 7 个​​复合 (int,double,double) 数据集和可变数量的样本。

现在我想通过连接每个数据集来连接所有这些文件,这样最后我就有一个包含 7 个数据集的 750 GB 文件。

目前我正在运行一个 h5py 脚本:

创建一个 HDF5 文件,其中包含无限最大值的正确数据集 依次打开所有文件 检查样本数量是多少(因为它是可变的) 调整全局文件的大小 附加数据

这显然需要好几个小时, 你有什么改进的建议吗?

我正在开发一个集群,所以我可以并行使用 HDF5,但是我在 C 编程方面不够好,无法自己实现某些东西,我需要一个已经编写好的工具。

【问题讨论】:

一种可能性是将集群上的文件对合并在一起;将问题减少到 250 个 3GB 文件,然后是 125 个 6GB 文件,依此类推。仅当部分合并的文件在以后合并结果时可以节省任何时间时,这才有帮助。 @sarnold 我在 NERSC 研究 hopper,理论 I/O 速度为 25 GB/s,文件系统完全并行并支持 MPI I/O。 我在考虑一次读取 3 或 4 个文件,然后将它们全部写回,但最好是一个 c 实用程序,它以某种方式利用 mpi I/O。 hdf5 的一个功能是您可以在主文件的“文件夹”中“挂载”多个子文件。这样,可能不需要将它们全部合并到一个文件中。见这里:davis.lbl.gov/Manuals/HDF5-1.4.3/Tutor/mount.html 看到这个sn-p:gist.github.com/zonca/8e0dda9d246297616de9 【参考方案1】:

我发现大部分时间都花在调整文件大小上,因为我在每一步都在调整大小,所以我现在首先浏览所有文件并获取它们的长度(它是可变的)。

然后我创建全局 h5file,将总长度设置为所有文件的总和。

只有在这个阶段之后,我才用所有小文件中的数据填充 h5file。

现在每个文件大约需要 10 秒,因此应该不到 2 小时,而之前需要更多时间。

【讨论】:

【参考方案2】:

我知道回答这个问题可以让我获得一个死灵徽章 - 但最近我在这方面的情况有所改善。

在 Julia 中,这需要几秒钟。

    创建一个 txt 文件,列出所有 hdf5 文件路径(如果有很多,您可以使用 bash 一次性完成) 循环读取txt文件的每一行并使用label$i = h5read(original_filepath$i, "/label") 连接所有标签 label = [label label$i] 然后写:h5write(data_file_path, "/label", label)

如果您有组或更复杂的 hdf5 文件,也可以这样做。

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于连接大量 HDF5 文件的主要内容,如果未能解决你的问题,请参考以下文章

将 hdf5 文件加载到 python xarrays

在 R 中加载后,我应该如何关闭 hdf5 文件?

如何读取 .hdf5 数据文件作为卷积神经网络的输入?

将数百个 csv 文件转换为 hdf5 文件

查询 SQL + HDF5 混合

如何有效地将数据附加到 C 中的 HDF5 表?