Допустим, у вас есть много файлов для архивации. Они находятся в нескольких различных форматах файлов (txt, docx, pdf, png, jpg, mp3, zip и т.д.).

Каковы наилучшие методы для их сжатия, чтобы они занимали как можно меньше места?

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

Другой пример: лучше ли сжимать файлы одного формата вместе?

Меня не интересует, какой формат сжатия является лучшим в целом, но было бы интересно узнать, работают ли некоторые из них лучше в некоторых случаях.

1 ответ1

0

Прежде всего, кроме текстовых и PDF-файлов, все, что вы перечислили, уже сжато. Файлы DOCX представляют собой сжатые XML-файлы в формате gzip (ну, действительно, DEFLATE, но в них используется заголовок, совместимый с gzip), PNG использует DEFLATE, JPG и MP3 делают свое дело (комбинация алгоритмов, используемых каждым, зависит от их формата), а также ZIP-файлы. используйте либо DEFLATE, либо иногда BZip2. Из них только JPEG и MPEG могут получить значительно лучшие коэффициенты сжатия, но это только в том случае, если они были минимально сжаты с самого начала, и даже тогда прирост, вероятно, будет минимальным. Файлы PDF также могут не очень хорошо сжиматься, поскольку они могут быть в основном изображениями, а не текстом, которые, вероятно, уже тоже сжаты (обычно с использованием сжатия JPEG).

Теперь об этом, на ваши основные вопросы:

Помогает ли группировка похожих типов файлов?

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

Может ли это помочь в вашем случае - это то, что вам, к сожалению, придется проверить.

Являются ли определенные алгоритмы лучше в определенных случаях, чем в других?

Абсолютно. JPEG и MPEG layer 3 являются примерами этого. Оба оптимизированы для сжатия очень специфического типа данных (изображения или аудио). Brotli - еще один хороший пример того, что лучше в некоторых обстоятельствах, он оптимизирован для потоковой передачи текстовых данных. Большинство форматов сжатия, которые вы, вероятно, будете использовать, хотя и общего назначения, что обычно означает, что они отлично справляются со сжатием таких вещей, как текстовые данные, и довольно плохо справляются со сжатием данных, которые не структурированы в побайтный поток. (DEFLATE - это алгоритм общего назначения, который действительно показывает, когда вы сравниваете размер изображения PNG с другим идентичным изображением JPEG).

Учитывая, что у вас много смешанных данных, вам, вероятно, не стоит слишком беспокоиться об этом.

Какой самый эффективный способ архивирования большого количества данных, чтобы он занимал минимальное пространство?

Вероятно, какой-то вариант PAQ. Алгоритмы PAQ, как правило, считаются лучшими (с точки зрения степени сжатия) универсальными алгоритмами сжатия, которые широко доступны. Они также требуют FOREVER для сжатия любого объема данных разумного размера, поэтому они могут оказаться непрактичными в вашем конкретном случае. Более реалистичные варианты с точки зрения того, сколько времени они занимают, включают:

  • XZ: при этом используется сжатие LZMA с некоторой дополнительной предварительной обработкой, которая позволяет выполнять сжатие машинного кода выше среднего уровня. Широко доступен на любой платформе, кроме Windows (хотя вы можете получить его в Windows), и, как правило, получает действительно хорошие коэффициенты сжатия (LZMA является одним из современных золотых стандартов для алгоритма сжатия, который получает разумную производительность и хорошие коэффициенты сжатия).
  • ZSTD: это более новый, разработанный великими разработчиками программного обеспечения, работающими на Facebook. В большинстве случаев он работает быстрее, чем XZ, и получает сопоставимые (как мне кажется, чуть лучше) коэффициенты сжатия. Пока не так широко доступны, но стоит попробовать, если вы можете получить его в своей системе.

В любом случае вам нужен формат архива для группировки файлов, если вы хотите, чтобы все они легко обрабатывались в одном месте. Tar - это формат, который я обычно использую, но я в основном имею дело с Linux. ZIP-файл без сжатия (вы можете сделать это в Windows с помощью командной строки) также будет работать.

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .