Я передаю тысячи файлов .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?