Загрузить группу из hdf5 - PullRequest
       10

Загрузить группу из hdf5

1 голос
/ 30 января 2020

У меня есть файл hdf5, который содержит наборы данных внутри групп. Пример:

group1/dataset1
group1/dataset2
group1/datasetX


group2/dataset1
group2/dataset2
group2/datasetX

Я могу прочитать каждый набор данных независимо. Вот как я читаю набор данных из файла .hdf5:

def hdf5_load_dataset(hdf5_filename, dsetname):
    with h5py.File(hdf5_filename, 'r') as f:
        dset = f[dsetname]
        return dset[...]

# pseudo-code of how I call the hdf5_load_dataset() function
group = {'group1':'dataset1', 'group1':'dataset2' ...}

for group in groups:
    for dataset in groups[group]:
        dset_value = hdf5_load_dataset_value(path_hdf5_file, f'{group}/{dataset}')
        # do stuff

Я хотел бы знать, возможно ли загрузить в память все наборы данных группы 1, затем группы 2, и так далее c как словарь или аналог в одном файле читать. Мой сценарий занимает довольно много времени (4 минуты), чтобы прочитать ~ 200 тыс. Наборов данных. Есть 2k групп с 100 наборами данных. Поэтому, если я загружу группу в память сразу, она не будет перегружена, и я увеличу скорость.

Это псевдокод того, что я ищу:

for group in groups:
    dset_group_as_dict = hdf5_load_group(path_hdf5_file, f'{group}')

    for dataset in dset_group_as_dict;
        #do stuff

РЕДАКТИРОВАТЬ:

Внутри каждого файла .csv:

time, amplitude
1.000e-08, -1.432e-07
1.001e-08, 7.992e-07
1.003e-08, -1.838e-05
1.003e-08, 2.521e-05

Для каждого файла .csv в каждой папке у меня есть набор данных для time и для amplitude. Структура hdfile выглядит следующим образом:

XY_1/impact_X/time
XY_1/impact_Y/amplitude

, где

time = np.array([1.000e-08, 1.001e-08, 1.003e-08, ...])  # 500 items
amplitude = np.array([-1.432e-07, 7.992e-07, -1.838e-05, ...])  # 500 items

XY_1 - это позиция в пространстве.

impact_X означает, что X было затронуто в положении XY_1, поэтому амплитуда X изменилась.

Итак, XY_1 должен быть в другой группе XY_2, а также impact_X, impact_Y et c с они представляют данные для конкретной позиции XY.

Мне нужно создать графики из каждой или только одной пары (время, амплитуда) (настраивается). Мне также нужно сравнить амплитуды с «золотым» массивом, чтобы увидеть различия и рассчитать другие вещи. Для выполнения вычислений я прочитаю все наборы данных, выполню расчеты и сохраню результат.

У меня более 200 тыс. Файлов .csv для каждого теста, в общей сложности более 5 млн. Использование 5M чтения с диска в этом случае займет довольно много времени. Для файлов 200k, экспортируя все .csv в уникальный файл JSON, требуется ~ 40 секунд для выполнения, с использованием .csv требуется ~ 4 минуты. Я не могу больше использовать уникальный json из-за проблем с памятью при загрузке одного файла JSON. Вот почему я выбрал hdf5 в качестве альтернативы.

РЕДАКТИРОВАТЬ 2:

Как я читаю файл CSV:

def read_csv_return_list_of_rows(csv_file, _delimiter):
    csv_file_list = list()
    with open(csv_file, 'r') as f_read:
        csv_reader = csv.reader(f_read, delimiter = _delimiter)
        for row in csv_reader:
            csv_file_list.append(row)
    return csv_file_list

1 Ответ

2 голосов
/ 31 января 2020

Нет, не существует одной функции, которая считывает несколько групп или наборов данных одновременно. Вы должны сделать это самостоятельно из функций более низкого уровня, которые читают одну группу или набор данных.

И можете ли вы дать нам дополнительный контекст? Что это за данные и как вы хотите их обработать? (Хотите ли вы вести статистику? Составлять графики? И так далее.) Чего вы в конечном итоге пытаетесь достичь? Это может помочь нам избежать классической проблемы XY .

В своем предыдущем вопросе вы сказали, что преобразовали много маленьких файлов CSV в один большой файл HDF. Можете ли вы сказать нам, почему? Что плохого в том, чтобы иметь много маленьких файлов CSV?

По моему опыту, файлы HDF с огромным количеством групп и наборов данных довольно медленны, как вы сейчас испытываете. Лучше иметь относительно немного, но больше наборов данных. Возможно ли объединить несколько наборов данных в один? Если нет, HDF может быть не лучшим решением для вашей проблемы.

...