Объединить большое количество файлов HDF5
-
27-10-2019 - |
Вопрос
У меня около 500 файлов HDF5 каждый из 1,5 ГБ.
Каждый из файлов имеет одинаковую точную структуру, которая представляет собой 7 составных (int, двойной, двойной) наборы данных и переменное число образцов.
Теперь я хочу объединить все эти файлы, объединяя каждый из наборов данных, чтобы в конце у меня был один файл 750 ГБ с моими 7 наборами данных.
В настоящее время я использую сценарий H5Py, который:
- Создает файл HDF5 с правильными наборами данных Unlimited Max
- Открыть в последовательности все файлы
- Проверьте, что такое количество образцов (как это переменное)
- Изменить размер глобального файла
- Добавить данные
Это, очевидно, занимает много часов, у вас есть предложение об улучшении этого?
Я работаю над кластером, поэтому я мог бы использовать HDF5 параллельно, но я недостаточно хорош в В Программирование.
Решение
Я обнаружил, что большую часть времени была потрачена на изменение размера размера файла, так как я изменял размер на каждом шаге, поэтому я сейчас сначала иду в катастрофе всех своих файлов и получаю их длину (это переменная).
Затем я создаю глобальный h5file, устанавливающий общую длину на сумму всех файлов.
Только после этого этапа I заполняет H5 -файл данных из всех небольших файлов.
Теперь это занимает около 10 секунд для каждого файла, так что это должно занять менее 2 часов, в то время как это заняло гораздо больше.
Другие советы
Я получаю, что ответ на это приносит мне значок Necro - но в этой области все улучшилось в этой области.
В Джулии это занимает несколько секунд.
- Создайте файл TXT, в котором перечислены все пути файлов HDF5 (вы можете использовать Bash, чтобы сделать это за один раз, если есть много)
- В цикле считывайте каждую строку файла TXT и используйте
label$i = h5read(original_filepath$i, "/label")
- Concat All the Mabels Label = [метка метки $ i
- Тогда просто напишите:
h5write(data_file_path, "/label", label)
То же самое можно сделать, если у вас есть группы или более сложные файлы HDF5.
Ответ Эшли хорошо сработал для меня. Вот реализация ее предложения в Джулии:
Сделайте текстовый файл, перечисляющий файлы для объединения в Bash:
ls -rt $somedirectory/$somerootfilename-*.hdf5 >> listofHDF5files.txt
Запишите скрипт Юлии, чтобы объединить несколько файлов в один файл:
# 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