1

Вкратце: можно ли использовать сжатие Deflate только с форматом zip (-tzip) в 7zip?


Я хочу заархивировать большой каталог (сотни ГиБ) с диска на другой, сохраняя скорость ввода-вывода такой же или лучше, чем без сжатия.

Мне нравится формат 7z по разным причинам, но сжатия LZMA и Bzip2 слишком медленные, даже с -mx=1 . Я пробовал 7z a -mm=Zip -mx=1 -mmt=4-mm=GZip который тоже использует Deflate), но я получаю ошибку аргумента после фазы сканирования файла. http://7zip.bugaco.com/7zip/MANUAL/switches/method.htm

Моим типичным решением было бы использование tar с .tar.lzo (LZOP), который легко достигает 100 МБ / с однопоточным при скорости сжатия по умолчанию; или .tar.gz с GZIP=-1 . Очень быстрый компрессор - lbzip2 с многопоточностью, но его нельзя запустить из самого tar.

Мои исходные диски обычно читаются со скоростью 20 МБ / с, иногда 100 (с файлами размером несколько МБ); цель записывает со скоростью до 80 МБ / с. Так что это скорость, которую должен иметь компрессор, в идеале, даже если он однопоточный. Доступно до 8 ядер и 16 ГБ оперативной памяти.

2 ответа2

4

Вы можете попробовать 7-Zip Zstandard версию. Этот форк поддерживает дополнительные кодеки, которые очень быстры для сжатия и распаковки.

Вот краткое резюме используемых кодеков:

  1. LZ4 - самая быстрая компрессия / декомпрессия, но не слишком высокая степень сжатия

  2. Lizard / LZ5 - лучшее соотношение, чем LZ4 и часто быстрее при декомпрессии, чем LZ4 ... но сжатие немного медленнее

  3. Brotli и Zstandard - zstd часто немного быстрее, чем Brotli, но для текстового содержимого Brotli может быть немного лучше;)

Потоки поддерживаются всеми 5 кодеками, до 256 потоков в настоящее время.

Запустите это как:

7z a archiv.7z -m0=lz5 -mx1 -mmt=4

7z a archiv.7z -m0=zstd -mx1 -mmt=4

7z a archiv.7z -m0=brotli -mx1 -mmt=1 .. 7z a archiv.7z -m0=brotli -mx1 -mmt=256

И так далее...

2

Очень быстрый компрессор - lbzip2 с многопоточностью, но его нельзя запустить из самого tar.

В GNU tar вы можете указать, какой компрессор с флагом. Примеры: tar -I "zstd -T0" или tar --use-compress-program=pigz

Если вам нужен быстрый однопоточный компрессор, вы можете использовать lz4.

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

# create
tar -c /inputdir | pigz --fast > output.tar.gz
# decompress
pigz -d input.tar.gz | tar -x 

Мои исходные диски обычно читаются со скоростью 20 МБ / с, иногда 100

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

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