Быстрое сжатие в формате 7z (например, zip или gzip)

1812
Nemo

Вкратце: можно ли использовать сжатие 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 ГБ оперативной памяти.

1

2 ответа на вопрос

4
Tino Reichardt

Вы можете попробовать 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
the8472

Очень быстрый компрессор - 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, который я оптимизировал для многих маленьких файлов.

Нет, моим узким местом обычно является не I / O (за исключением lzop, который намного быстрее, чем I / O). Когда я говорю «20, иногда 100», я имею в виду, что некоторые диски постоянно читают только по 20, в то время как некоторые другие у меня работают быстрее. В настоящее время я использую lbzip2 или lzop, когда ввод / вывод слишком быстр для lbzip2. Спасибо за упоминание fastar, попробую с диском. Nemo 6 лет назад 0
Поскольку ваши README упоминают ext4, возможно, мне следовало сказать, что мои диски в основном внешние NTFS-диски ... Nemo 6 лет назад 0

Похожие вопросы