Почему заархивированный файл HDF5 по-прежнему хорошо сжимается, даже если все наборы данных сжаты внутри файла?

Я использую файловую систему HDF5 в своем настольном приложении. Я использовал сжатие GZIP уровня 5 со всеми наборами данных внутри файла.

Но тем не менее, когда я сжимаю файл HDF5 с помощью 7zip, размер файла становится еще меньше примерно на половину или одну треть!!!

Я следую процессу:

  1. Создание файла HDF5.
  2. Импорт данных в файл.
  3. Освобождение неучтенного места, если оно есть, с помощью утилиты h5repack.
  4. Используя 7zip, я заархивирую файл в .zip

Как это возможно?

Где область большего сжатия?

Как создать еще меньший файл HDF5? Любые предложения по использованию свойства (H5P).

Я думал, что 7zip может безжалостно сжимать мой файл, используя GZIP уровня 9, но я попытался использовать GZIP уровня 9 в моем файле HDF5. Размер нового файла по-прежнему вдвое меньше исходного.


person Shubhjot    schedule 20.08.2018    source источник
comment
Каждый фрагмент данных сжимается сам по себе. Итак, первый вопрос: какой у вас размер/форма куска? Вы используете перемешивание правильно? (иначе степень сжатия может быть намного хуже)   -  person max9111    schedule 27.08.2018
comment
Да, я использую перемешивание перед архивированием. Я храню 10 тыс. точек на набор данных и использую размер блока 5 тыс.   -  person Shubhjot    schedule 27.08.2018


Ответы (2)


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

person Quincey Koziol    schedule 25.08.2018

gzip имеет максимальную степень сжатия около 1000:1. Если данные более сжимаемы, вы можете сжать их во второй раз, чтобы получить большее сжатие (второй раз может быть снова gzip). Вы можете провести простой эксперимент с файлом, состоящим только из нулей:

% dd ibs=1 count=1000000 < /dev/zero > zeros
% wc -c zeros
1000000
% gzip < zeros | wc -c
1003
% gzip < zeros | gzip | wc -c
64

Итак, какова была степень сжатия вашего первого сжатия?

person Mark Adler    schedule 21.08.2018
comment
Марк, HDF5 использует сжатие совсем по-другому. Например, мы заархивируем 3 .docx файла (file1.docx, file2.docx, file3.docx) и получим один zip (document.zip). Итак, в одном zip-контейнере 3 файла. Теперь, когда вам нужно использовать файл2.docx, вы разархивируете документы.zip, а затем используете файл2.docx. Следовательно, это случай применения сжатия к нескольким файлам. - person Shubhjot; 24.08.2018
comment
Не имеет значения. Ты не ответил на мой вопрос. Какова степень сжатия файла HDF5? - person Mark Adler; 24.08.2018
comment
Коэффициент сжатия варьируется внутри файла HDF5 и зависит от фрагментации. В моем случае разные группы имеют разные типы составных наборов данных. Поэтому я использую разный размер фрагмента в каждом наборе данных. Следовательно, коэффициент сжатия варьируется от 2:1 до 47:1 в одном файле HDF5 с использованием GZIP уровня 5. Размер этого файла составляет 3,14 МБ. Если я заархивирую этот файл HDF5 размером 3,14 МБ, размер zip-файла составит 1,27 МБ. - person Shubhjot; 27.08.2018
comment
Тогда у вас нет записей, которые насыщают возможности gzip по сжатию. Другой ответ, что большие части вашего файла вообще не сжаты, вероятно, является причиной. - person Mark Adler; 27.08.2018