Объединить большое количество файлов HDF5
У меня есть около 500 файлов HDF5 каждый около 1,5 ГБ.
каждый из файлов имеет одинаковую точную структуру, которая составляет 7 составных (int,double,double) наборов данных и переменное количество образцов.
теперь я хочу объединить все эти файлы, объединив каждый из наборов данных, чтобы в конце у меня был один файл 750 GB с моими 7 наборами данных.
В настоящее время я запускаю скрипт h5py, который:
- создает файл HDF5 с правом наборы данных unlimited max
- открыть последовательно все файлы
- проверьте, какое количество образцов (как это переменная)
- изменить размер глобального файла
- добавить информацию
Это, очевидно, занимает много часов, у вас есть предложения по улучшению этого?
Я работаю над кластером, поэтому я мог бы использовать HDF5 параллельно, но я недостаточно хорош в C программирование для реализации чего-то себя, Мне нужен уже написанный инструмент.
3 ответов
Я обнаружил, что большая часть времени была потрачена на изменение размера файла, так как я изменял размер на каждом шаге, поэтому теперь я сначала просматриваю все мои файлы и получаю их длину (она переменная).
затем я создаю глобальный h5file, устанавливающий общую длину на сумму всех файлов.
только после этого этапа я заполняю h5file данными из всех небольших файлов.
теперь это занимает около 10 секунд для каждого файла, поэтому это должно занять менее 2 часов, в то время как раньше это требовало гораздо большего.
Я получаю, что ответ на это зарабатывает мне значок некро - но в последнее время все улучшилось для меня в этой области.
в Julia это занимает несколько секунд.
- создайте txt-файл, в котором перечислены все пути к файлам hdf5 (вы можете использовать bash для этого за один раз, если их много)
- в цикле прочитайте каждую строку txt-файла и используйте
label$i = h5read(original_filepath$i, "/label")
- объединить все метки label = [label label$i]
- тогда просто напишите:
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