Многопоточная поддержка в 7za


16

(Сначала я опубликовал это на сервере, но потом понял, что это, вероятно, здесь).

Я пытаюсь сжать очень большой текстовый файл, используя 7za (p7zip) 9.20. Опция -mmt, похоже, не имеет никакого эффекта. Я пробовал оба -mmt = on и -mmt = 2. Это 8-ядерный компьютер. Один человек предложил добавить -m0 = lzma2 в качестве аргумента, но это просто дает мне E_INVALIDARG. Кто-нибудь знает, как заставить это работать?

Это не имеет никакого эффекта:

7za a -mx=9 -mmt=2 -p myarchive.zip bigfile.txt

И это не с ошибкой:

7za a -m0=lzma2 -mx=9 -mmt=2 -p myarchive.zip bigfile.txt


7-Zip (A) [64] 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18
p7zip Version 9.20 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,8 CPUs)
Scanning

Creating archive release_20120601-1-http.zip



System error:
E_INVALIDARG

Я считаю, что вариант просто -mmt, а не -mmt=2. Также я считаю, что правильный синтаксис есть -mx9, хотя оба могут работать.
Прорыв

Спасибо, но -mmt без опции все еще использует только один поток. В соответствии с docs.bugaco.com/7zip/MANUAL/switches/method.htm#ZipMultiThread , вы можете указать количество потоков для использования, -mmt = N.
Брайан Л

Я бы по-прежнему рекомендовал использовать LZMA / Deflate, хотя он только однопоточный. Хотя вы можете получить увеличенную скорость сжатия с помощью BZip2, она менее эффективна при сжатии простого текста, а однопоточные варианты работают медленнее, чем эквиваленты LZMA / Deflate.
Прорыв

@Breakthrough: BZip2 обычно обеспечивает лучшее сжатие, чем DEFLATE, как показано в вашей ссылке. Это также намного, намного быстрее, чем LZMA (при сжатии).
Деннис

Ответы:


25

В соответствии с параметром -m (Установить метод сжатия) # ZipMultiThread - руководство и документация 7ZIP , по mtумолчанию используется значение on, поэтому указывать его вообще не нужно.

Однако реализация алгоритма DEFLATE в 7zip не поддерживает многопоточность!

Как вы уже обнаружили,

7za a archive.zip bigfile

использует только одно ядро.

Но .zipфайлы сжимают каждый файл индивидуально. При сжатии нескольких файлов опция многопоточности сжимает один файл на ядро ​​одновременно.

Попробуйте, и вы увидите, что

7za a archive.zip bigfile1 ... bigfileN

будет использовать все доступные Nядра.

Если вы хотите ускорить сжатие одного файла, у вас есть два варианта:

  1. Разделить bigfileна куски.

  2. Используйте другой алгоритм сжатия.

    Например, реализация алгоритма BZip2 в 7zip поддерживает многопоточность.

    Синтаксис:

    7za a -mm=BZip2 archive.zip bigfile
    

Кроме того, синтаксическая ошибка вызвана вашей попыткой использовать алгоритм LZM для .zipконтейнера. Это невозможно.

Возможные алгоритмы для .zipconatiners: DEFLATE (64), BZip2 и без сжатия.

Если вы хотите использовать алгоритм LZM, используйте .7zконтейнер. Этот контейнер также обрабатывает следующие алгоритмы: PPMd, BZip2, DEFLATE, BCJ, BCJ2 и без сжатия.


@ Денис Я думал, что операционная система использует LZMA (2), которая из документации «Сжатие LZMA использует только 2 потока». Хотя я согласен, интуитивно (из-за того, как работает кодирование Лемпеля-Зива ), было бы очень сложно использовать многопоточность LZMA или Deflate (это просто LZMA с кодированием Хаффмана).
Прорыв

1
@Breakthrough: Сначала я тоже. (Посмотрите исправления моего ответа.) Вот в чем была ошибка синтаксиса. Вы не можете использовать сжатие LZMA с .zipконтейнером.
Деннис

@ Денис, ах, спасибо за разъяснение. Не видел, чтобы ОП использовал .ZIPконтейнер.
Прорыв

Подождите, поэтому я получу другой результат, если я просто изменю расширение файла контейнера на .7z?
Брайан Л

3
@BrianL встроена кнопка «спасибо». Она выглядит как стрелка, направленная вверх;)
nhinkle

5

Это старый вопрос, и не ответ на конкретный вопрос, а ответ на дух вопроса (Использование всех ядер для сжатия формата zip)

pigz (параллельный gzip с опцией .zip)

pigz -K -k archive.zip bigfile txt

Это даст вам zip-совместимый файл в 7 раз быстрее для того же уровня сжатия.

Быстрое сравнение zip-совместимых и не zip-компрессоров с использованием одного и нескольких ядер.

время на i7-2600k, чтобы сжать 1,0 ГБ TXT-файла на Fedora 20

67s (120mb) 7za (zip,1 thread)
15s (141mb) 7za -mx=4 (zip,1 thread)
17s (132mb) zip (zip,1 thread)
 5s (131mb) pigz -K -k (zip,8 threads)
 9s (106mb) bsc (libbsc.com) (not zip,8 threads)
 5s (130mb) zhuff -c2 (not zip,8 threads)
 2s (149mb) zhuff (not zip,8 threads)

настенные времена, чтобы распаковать

4.2s unzip -t
2.0s pigz -t
5.1s bsc d
0.5s zhuff -d

почему pigz когда можно pbzip2 или pixz?
кивни

gzip намного, намного быстрее, чем bzip2, поэтому дополнительное сжатие не всегда того стоит.
jesjimher

0

Просто используйте -mmt [N + 1]

Например: -mmt2 для одного потока, -mmt9 для восьми потоков


-1

Проверено и протестировано: для использования многопоточности на 7za параметр должен быть "-mmt #", а не "-mmt = #", а знак равенства заставляет его игнорировать.

Как я обнаружил? После того, как я запустил 7z без каких-либо параметров, он показывает информацию о параметрах, на переключателях он говорит «-mmt [N]», а не «-mmt = [N]»

Так что, если я хорошо понимаю, параметр, который вы вводите "-mmt = 2", может быть написан неправильно и может быть "-mmt2" без знака равенства.

Не уверен, хорошо ли я понимаю, мой английский очень плохой.

Кстати, почему вы используете «7za» вместо просто «7z»?

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

Команда для выполнения теста 7z только с одним потоком: 7z b -mmt1

Команда для выполнения теста 7z только с двумя потоками: 7z b -mmt2

Команда для выполнения теста с 7za только с двумя потоками: 7za b -mmt2

Команда для выполнения теста с 7za только с одним потоком: 7za b -mmt1

В параметре ˋ-mmt # sign знака равенства нет, ни для 7z, ни для 7za.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.