Сжатие файлов HDF5 с помощью H5Py - PullRequest
1 голос
/ 30 января 2020

Я передаю тысячи файлов .csv, содержащих time и amplitude, в файл .hdf5. В качестве примера я использовал небольшое количество файлов .csv, которые в общей сложности соответствуют ~ 11 МБ.

После передачи всех файлов .csv в hdf5, последний имеет размер ~ 36 МБ (без использования compression="gzip").

При использовании compression="gzip" размер файла составляет около 38 МБ.

Я понимаю, что hdf5 сжимает только набор данных, то есть массив numpy в моем случае (~ 500 строк с числом с плавающей точкой).

Для сравнения я сохранил все файлы .csv в файле. json, сжал их и затем прочитал. Я выбрал hdf5 из-за проблем с памятью, поскольку файл json загружается полностью в память с размером, в 2–X раз превышающим размер файла.

Таким образом я добавляю набор данных в файл .hdf5 .

def hdf5_dump_dataset(hdf5_filename, hdf5_data, dsetname):
        with h5py.File(hdf5_filename, 'a') as f:
            dset = f.create_dataset(dsetname, data=hdf5_data, compression="gzip", chunks=True, maxshape=(None,))

Вот как я читаю набор данных из файла .hdf5.

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

Структура папок с файлами .csv:

root/
    folder_1/
        file_1.csv
        file_X.csv  
    folder_X/
        file_1.csv
        file_X.csv  

Внутри каждого файла .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 в файле hdf5:

# csv_dict is a dict() with all folders and csv files as keys
# ex. csv_dict['folder_1']['file_1']  (without the .csv extension)

for folder in csv_dict:
    for file in csv_dict[folder]:
        path_waveform = f"{folder}/{file}.csv"
        time, amplitude = self.read_csv_return_list_of_time_amplitude(path_waveform)

        hdf5_dump_dataset(path_hdf5_waveforms, amplitude, '/'.join([folder, file, 'amplitude']))

        hdf5_dump_dataset(path_hdf5_waveforms, time, '/'.join([folder, file, 'time']))

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

folder1/file_1/time
folder1/file_1/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

Мой вопрос: есть ли способ сжать весь файл hdf5?

...