连接大量HDF5文件

时间:2011-03-17 23:39:16

标签: dataset hdf5 scientific-computing

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

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

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

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

  • 创建一个HDF5文件,其中包含无限制最大数据集
  • 按顺序打开所有文件
  • 检查样本数量(因为它是可变的)
  • 调整全局文件的大小
  • 附加数据
这显然需要很多小时, 你有关于改善这个的建议吗?

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

3 个答案:

答案 0 :(得分:9)

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

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

仅在此阶段之后,我用所有小文件中的数据填充h5文件。

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

答案 1 :(得分:1)

我得到了回答,这给我带来了一个死神徽章 - 但最近我在这方面的情况有所改善。

在朱莉娅这需要几秒钟。

  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)
  5. 如果您有组或更复杂的hdf5文件,则可以执行相同操作。

答案 2 :(得分:1)

阿什利的回答对我很有用。以下是朱莉娅对她的建议的实施:

制作文本文件,列出要在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