Какие инструменты сжатия доступны в Ubuntu, которые могут выиграть от многоядерного процессора.
Какие инструменты сжатия доступны в Ubuntu, которые могут выиграть от многоядерного процессора.
Ответы:
Есть два основных инструмента. 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.
/dev/urandom
Это не лучший выбор для тестирования инструментов сжатия, поскольку случайные данные по определению несжимаемы. Это отчасти объясняет, почему в обоих случаях выходной файл на ~ 450 МБ больше входного.
00000000000000000000000000000000
. Вот как работает случайный;) То, о чем вы говорите - это практические средние. Это вряд ли вы будете генерировать 100MB файл только нули. И я согласен с духом того, что вы говорите, я просто не согласен с «по определению», потому что это не определение (потому что это неточно).
wget http://mattmahoney.net/dc/enwik8.zip
получить 96 МБ (сжатый 21 МБ) текста из Википедии. Более полный набор тестов см. Здесь .
Ну, ключевое слово было параллельным . После поиска всех параллельных инструментов сжатия я обнаружил следующее:
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%)
lrzip
может быть распакован с использованием pbzip2
, например.
В дополнение к хорошему резюме выше (спасибо Луису), в эти дни люди могут также захотеть рассмотреть 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.
pixz
архивы не совместимы со стандартным xz
форматом pxz
.
pixz
может распаковывать xz
архивы и xz
может распаковывать pixz
архивы. Однако параметры командной строки xz
и pixz
отличаются.
pixz
.
XZ Utils поддерживает многопоточное сжатие начиная с v5.2.0, изначально оно было по ошибке задокументировано как многопоточное распаковывание.
Например: tar -cf - source | xz --threads=0 > destination.tar.xz
export XZ_DEFAULTS="-T 0"
а затем просто использовать обычный деготь вызов, то есть tar cJf target.tar.xz source
.
lzop также может быть приемлемым вариантом, хотя он однопоточный.
Он использует очень быстрый алгоритм сжатия lempel-ziv-oberhumer , который, по моим наблюдениям, в 5-6 раз быстрее, чем gzip.
Примечание. Хотя он еще не является многопоточным, он, вероятно, превзойдет PIGZ в системах с 1-4 ядрами. Вот почему я решил опубликовать это, даже если оно не дает прямого ответа на ваш вопрос. Попробуйте, это может решить проблему узкого места вашего ЦП при использовании только одного ЦП и сжатии немного хуже. Я часто находил, что это лучшее решение, чем, например, pigz.
Компрессор LZMA2 p7zip использует оба ядра в моей системе.
Это не совсем ответ, но я думаю, что это достаточно уместно, чтобы поделиться своими оценками, сравнивающими скорость gzip
и pigz
реальное HW в реальном сценарии. Как pigz
и многопоточная эволюция, которую я лично решил использовать с этого момента.
Метаданные:
Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz
(4c / 8t) + Nvme SSDXubuntu 17.10 (artful)
gzip
версия: 1.6
pigz
версия: 2.4
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
алгоритм, поскольку сжатие занимало огромное количество времени при не столь значительном объеме сэкономленного дискового пространства.
Результирующие размеры файлов:
Zstandard поддерживает многопоточность начиная с версии 1.2.0 ¹. Это очень быстрый компрессор и декомпрессор, предназначенный для замены gzip, и он также может сжимать так же эффективно - если не лучше - как LZMA2 / XZ на самых высоких уровнях.
Вы должны использовать artful или более новую версию или скомпилировать последнюю версию из исходного кода, чтобы получить эти преимущества. К счастью, это не влечет за собой много зависимостей.