Объединить большое количество файлов HDF5

У меня есть около 500 файлов HDF5 каждый около 1,5 ГБ.

каждый из файлов имеет одинаковую точную структуру, которая составляет 7 составных (int,double,double) наборов данных и переменное количество образцов.

теперь я хочу объединить все эти файлы, объединив каждый из наборов данных, чтобы в конце у меня был один файл 750 GB с моими 7 наборами данных.

В настоящее время я запускаю скрипт h5py, который:

  • создает файл HDF5 с правом наборы данных unlimited max
  • открыть последовательно все файлы
  • проверьте, какое количество образцов (как это переменная)
  • изменить размер глобального файла
  • добавить информацию

Это, очевидно, занимает много часов, у вас есть предложения по улучшению этого?

Я работаю над кластером, поэтому я мог бы использовать HDF5 параллельно, но я недостаточно хорош в C программирование для реализации чего-то себя, Мне нужен уже написанный инструмент.

3 ответов


Я обнаружил, что большая часть времени была потрачена на изменение размера файла, так как я изменял размер на каждом шаге, поэтому теперь я сначала просматриваю все мои файлы и получаю их длину (она переменная).

затем я создаю глобальный h5file, устанавливающий общую длину на сумму всех файлов.

только после этого этапа я заполняю h5file данными из всех небольших файлов.

теперь это занимает около 10 секунд для каждого файла, поэтому это должно занять менее 2 часов, в то время как раньше это требовало гораздо большего.


Я получаю, что ответ на это зарабатывает мне значок некро - но в последнее время все улучшилось для меня в этой области.

в 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 файлов.


ответ Эшли хорошо сработал для меня. Вот реализация ее предложения в Юлии:

сделать текстовый файл с перечислением файлов для объединения в 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