Инструменты многоядерного сжатия

61

Какие инструменты сжатия доступны в Ubuntu, которые могут выиграть от многоядерного процессора.

Луис Альварадо
источник
Для справки, альтернативой может быть создание параллельных независимых архивов. Поэтому вместо создания myfiles.8core.xz вы создаете myfiles1.xz параллельно myfiles8.xz. Для этого потребуется агент по отправке. Оба подхода имеют дополнительные плюсы и минусы.
Acumenus
2
Пытался разархивировать 7 ГБ файл, используя bzip2, только чтобы узнать, что он не использует все мои 8 ядер. Прочитал об этом и решил попробовать pbzip2. Все еще работает только на одном ядре. Затем я заметил комментарии о том, что pbzip2 может только полностью распараллелить распаковку файлов, которые он сам сжал. В тех же комментариях высказывалось мнение, что lbzip2 может полностью распараллеливать любой файл bz2, что действительно было правдой - оно почти полностью использовало (80-90% ЦП) все мои ядра и распаковывалось намного быстрее.
Эди Бис

Ответы:

34

Есть два основных инструмента. lbzip2и pbzip2. Это принципиально разные реализации компрессоров bzip2. Я сравнил их (вывод - исправленная версия, но вы должны иметь возможность запускать команды)

cd /dev/shm  # we do all of this in RAM!
dd if=/dev/urandom of=bigfile bs=1024 count=102400

$ lbzip2 -zk bigfile 
Time: 0m3.596s
Size: 105335428 

$ pbzip2 -zk bigfile
Time: 0m5.738s6
Size: 10532460

lbzip2оказывается победителем по случайным данным. Это немного менее сжато, но намного быстрее. YMMV.

Оли
источник
5
похоже, что цифра отсутствует в pbzip2 Размер
Уэйн Уокер
4
/dev/urandomЭто не лучший выбор для тестирования инструментов сжатия, поскольку случайные данные по определению несжимаемы. Это отчасти объясняет, почему в обоих случаях выходной файл на ~ 450 МБ больше входного.
ali_m
1
Извините, я действительно педантичен, но действительно случайные данные могут быть сверхсжимаемыми. Вы можете попросить идеальный ГСЧ для 32 бит и получить 00000000000000000000000000000000. Вот как работает случайный;) То, о чем вы говорите - это практические средние. Это вряд ли вы будете генерировать 100MB файл только нули. И я согласен с духом того, что вы говорите, я просто не согласен с «по определению», потому что это не определение (потому что это неточно).
Оли
2
Когда мы оцениваем производительность различных методов сжатия, нас действительно интересует ожидаемый размер выходных данных для будущих примеров данных, которые мы хотим сжать. Если эти данные действительно случайные, то они не содержат статистической регулярности для использования компрессией, поэтому для последовательностей из N случайных байтов лучшее, на что мы можем надеяться, - это ожидаемая длина вывода в N байтов. Для некоторых примеров мы могли бы сделать немного лучше, для других мы могли бы сделать немного хуже (на практике мы почти всегда делаем хуже), но ожидаемая длина вывода осталась прежней.
ali_m
5
Я имею в виду «случайный» в смысле Колмогорова , который буквально определяется как несжимаемость. Универсального эталона для сжатия не существует, поскольку разные алгоритмы работают лучше для разных типов данных. Хорошее начало может состоять в том, чтобы просто передать ему какой-то текст, например, wget http://mattmahoney.net/dc/enwik8.zipполучить 96 МБ (сжатый 21 МБ) текста из Википедии. Более полный набор тестов см. Здесь .
ali_m
72

Ну, ключевое слово было параллельным . После поиска всех параллельных инструментов сжатия я обнаружил следующее:

PXZ - Parallel XZ - это утилита сжатия, которая использует преимущества сжатия LZMA различных частей входного файла на нескольких ядрах и процессорах одновременно. Его основная цель - использовать все ресурсы для ускорения времени сжатия с минимально возможным влиянием на степень сжатия.

sudo apt-get install pxz

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

Plzip - это массивно параллельная (многопоточная) версия lzip, использующая формат файла lzip; файлы, созданные plzip, полностью совместимы с lzip.

Plzip предназначен для более быстрого сжатия / распаковки больших файлов на многопроцессорных компьютерах, что делает его особенно хорошо подходящим для распространения больших программных файлов и архивирования больших объемов данных. Для файлов, достаточно больших, plzip может использовать сотни процессоров.

sudo apt-get install plzip

PIGZ - pigz, что означает параллельное внедрение GZip, является полностью функциональной заменой gzip, которая использует преимущества нескольких процессоров и нескольких ядер при сжатии данных.

sudo apt-get install pigz

PBZIP2 - pbzip2 - это параллельная реализация файлового компрессора bzip2, который использует pthreads и достигает почти линейного ускорения на машинах SMP. Вывод этой версии полностью совместим с bzip2 v1.0.2 (то есть: все сжатые с помощью pbzip2 могут быть распакованы с помощью bzip2).

sudo apt-get install pbzip2

LRZIP - многопоточная программа сжатия, которая может достигать очень высоких коэффициентов сжатия и скорости при использовании с большими файлами. Он использует комбинированные алгоритмы сжатия zpaq и lzma для максимального сжатия, lzo для максимальной скорости и уменьшения избыточности на больших расстояниях rzip. Он предназначен для масштабирования с увеличением объема оперативной памяти, дополнительно улучшая сжатие. Выбор оптимизации размера или скорости обеспечивает либо лучшее сжатие, чем может обеспечить даже lzma, либо лучшую скорость, чем у gzip, но с уровнями сжатия bzip2.

sudo apt-get install lrzip

Небольшой тест на сжатие (с использованием теста, созданного Оли):

ОРИГИНАЛЬНЫЙ РАЗМЕР ФАЙЛА - 100 МБ
PBZIP2 - 101 МБ (1% больше)
PXZ - 101 МБ (1% больше)
PLZIP - 102 МБ (1% больше)
LRZIP - 101 МБ (1% больше)
PIGZ - 101 МБ (1% больше) )

Небольшой тест сжатия (с использованием текстового файла):

ОРИГИНАЛЬНЫЙ РАЗМЕР ФАЙЛА - 70 КБ Текстовый файл
PBZIP2 - 16,1 КБ (23%)
PXZ - 15,4 КБ (22%)
PLZIP - 15,5 КБ (22,1%)
LRZIP - 15,3 КБ (21,8%)
PIGZ - 17,4 КБ (24,8%)

Луис Альварадо
источник
Примеры были бы отличными.
earthmeLon
@earthmeLon Прочтите ответ Оли, в котором упоминается, как создать файл примера. Затем перейдите к командам, которые я использовал.
Луис Альварадо
Я надеюсь, что результаты их взаимно совместимы. то есть вывод из lrzipможет быть распакован с использованием pbzip2, например.
Вине Менон
10

В дополнение к хорошему резюме выше (спасибо Луису), в эти дни люди могут также захотеть рассмотреть PIXZ, который в соответствии с README (Источник: https://github.com/vasi/pixz - я сам не проверял претензии ) имеет некоторые преимущества перед PXZ.

[Compared to PIXZ, PXZ has these advantages and disadvantages:]

    * Simpler code
    * Uses OpenMP instead of pthreads
    * Uses streams instead of blocks, not indexable
    * Uses temp files and doesn't combine them until the whole file is compressed, high disk/memory usage

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

nturner
источник
Тем не менее, я понимаю, что pixzархивы не совместимы со стандартным xzформатом pxz.
Mxx
5
@Mxx: форматы файлов совместимы. pixzможет распаковывать xzархивы и xzможет распаковывать pixzархивы. Однако параметры командной строки xzи pixzотличаются.
Снежок
Индексируемые файлы - большая победа pixz.
Острокач
9

Обновить:

XZ Utils поддерживает многопоточное сжатие начиная с v5.2.0, изначально оно было по ошибке задокументировано как многопоточное распаковывание.

Например: tar -cf - source | xz --threads=0 > destination.tar.xz

donbradken
источник
Вы можете также запустить , export XZ_DEFAULTS="-T 0" а затем просто использовать обычный деготь вызов, то есть tar cJf target.tar.xz source.
Scai
4

lzop также может быть приемлемым вариантом, хотя он однопоточный.

Он использует очень быстрый алгоритм сжатия lempel-ziv-oberhumer , который, по моим наблюдениям, в 5-6 раз быстрее, чем gzip.

Примечание. Хотя он еще не является многопоточным, он, вероятно, превзойдет PIGZ в системах с 1-4 ядрами. Вот почему я решил опубликовать это, даже если оно не дает прямого ответа на ваш вопрос. Попробуйте, это может решить проблему узкого места вашего ЦП при использовании только одного ЦП и сжатии немного хуже. Я часто находил, что это лучшее решение, чем, например, pigz.

CE4
источник
Разве это не лучше при декомпрессии? Сжатие занимает примерно столько же (или хуже), чем gzip
Леннарт Роллан
Я также могу засвидетельствовать, что lzop супер быстрый. Proxmox по умолчанию использует lzop для резервного копирования виртуальных машин.
Лонни Бест
1
lz4 еще быстрее (и имеет многопоточную версию).
Давид Балажич
3

Компрессор LZMA2 p7zip Установить p7zip использует оба ядра в моей системе.

Дэвид Фёрстер
источник
3

Это не совсем ответ, но я думаю, что это достаточно уместно, чтобы поделиться своими оценками, сравнивающими скорость gzipи pigzреальное HW в реальном сценарии. Как pigzи многопоточная эволюция, которую я лично решил использовать с этого момента.

Метаданные:

  • Используемое оборудование: Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz(4c / 8t) + Nvme SSD
  • Распределение GNU / Linux: Xubuntu 17.10 (artful)
  • gzip версия: 1.6
  • pigz версия: 2.4
  • Сжимаемый файл - 9,25 ГБ дамп SQL

gzip быстрый

time gzip -1kN ./db_dump.sql

real    1m22,271s
user    1m17,738s
sys     0m3,330s

gzip Лучший

time gzip -9kN ./db_dump.sql 

real    10m6,709s
user    10m2,710s
sys     0m3,828s

pigz быстрый

time pigz -1kMN ./db_dump.sql 

real    0m26,610s
user    1m55,389s
sys     0m6,175s

pigzлучший (нет zopfli)

time pigz -9kMN ./db_dump.sql 

real    1m54,383s
user    14m30,435s
sys     0m5,562s

pigz+ zopfliалгоритм

time pigz -11kMN ./db_dump.sql 

real    171m33,501s
user    1321m36,144s
sys     0m29,780s

Как итог, я бы не рекомендовал zopfliалгоритм, поскольку сжатие занимало огромное количество времени при не столь значительном объеме сэкономленного дискового пространства.

Результирующие размеры файлов:

  • лучшее с: 1309M
  • быстрое с: 1680M
  • zopfli : 1180M
Helvete
источник
2

Zstandard поддерживает многопоточность начиная с версии 1.2.0 ¹. Это очень быстрый компрессор и декомпрессор, предназначенный для замены gzip, и он также может сжимать так же эффективно - если не лучше - как LZMA2 / XZ на самых высоких уровнях.

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

  1. Был также сторонний pzstd в v1.1.0 zstd.
LiveWireBT
источник