Объединить большое количество файлов HDF5 - PullRequest
9 голосов
/ 18 марта 2011

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

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

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

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

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

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

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

Ответы [ 3 ]

9 голосов
/ 21 марта 2011

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

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

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

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

1 голос
/ 17 августа 2016

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

Создайте текстовый файл со списком файлов для объединения в 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
1 голос
/ 11 февраля 2016

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

У Юлии это занимает несколько секунд.

  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.

...