Вопрос

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

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

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

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

  • Создает файл HDF5 с правильными наборами данных Unlimited Max
  • Открыть в последовательности все файлы
  • Проверьте, что такое количество образцов (как это переменное)
  • Изменить размер глобального файла
  • Добавить данные

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

Я работаю над кластером, поэтому я мог бы использовать HDF5 параллельно, но я недостаточно хорош в В Программирование.

Это было полезно?

Решение

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

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

Только после этого этапа I заполняет H5 -файл данных из всех небольших файлов.

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

Другие советы

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

В Джулии это занимает несколько секунд.

  1. Создайте файл TXT, в котором перечислены все пути файлов HDF5 (вы можете использовать Bash, чтобы сделать это за один раз, если есть много)
  2. В цикле считывайте каждую строку файла TXT и используйте label$i = h5read(original_filepath$i, "/label")
  3. Concat All the Mabels Label = [метка метки $ i
  4. Тогда просто напишите: 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top