10

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

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

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

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

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

这显然需要很多小时,你有什么改进的建议吗?

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

4

3 回答 3

9

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

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

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

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

于 2011-03-21T18:08:32.683 回答
1

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

在 Julia 中,这需要几秒钟。

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

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

于 2016-02-11T07:34:53.137 回答
1

阿什利的回答对我来说效果很好。这是她在 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
于 2016-08-17T17:14:04.813 回答