Багатопотокова підтримка в 7za


18

(Я опублікував це спочатку на сервері за замовчуванням, але потім зрозумів, що він, ймовірно, належить тут.)

Я намагаюся стиснути дуже великий текстовий файл, використовуючи 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 / викачати.
Прорив

@ Попередження: 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контейнера. Це неможливо.

Можливі алгоритми для .zipконатинерів: DEFLATE (64), BZip2 та відсутність стиснення.

Якщо ви хочете використовувати алгоритм LZM, використовуйте .7zконтейнер. Цей контейнер також обробляє такі алгоритми: PPMd, BZip2, DEFLATE, BCJ, BCJ2 та відсутність стиснення.


@Dennis Я подумав, що ОП використовує LZMA (2), який із документації "для стиснення LZMA використовує лише 2 потоки". Хоча я погоджуюся, інтуїтивно (через те, як працює кодування Lempel-Ziv ), було б дуже важко багатопотокове LZMA або Спуску (що є просто LZMA з кодуванням Хаффмана).
Прорив

1
@ Попередження: Спочатку так само зробив і я. (Ознайомтеся з редакціями моєї відповіді.) Ось в чому полягала синтаксична помилка. Не можна використовувати стиснення LZMA з .zipконтейнером.
Денніс

@ Денніс ах, дякую за те, що це очистили. Не бачив, що ОП використовує .ZIPконтейнер.
Прорив

Зачекайте, тому я отримаю інший результат, якщо я просто зміню розширення файлу контейнера на .7z?
Брайан Л

3
@BrianL вбудована кнопка «спасибі». Це схоже на стрілку вгору;)
nhinkle

5

Це старе запитання, і не відповідь на конкретне запитання, а відповідь духу питання (Використання всіх ядер для стиснення zip-формату)

pigz (паралельний gzip з опцією .zip)

pigz -K -k archive.zip bigfile txt

Це дасть вам файл, сумісний із zip, на 7 разів швидше для того ж рівня стиснення.

Швидке порівняння 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 #" not "-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 # ˋ, ні для 7z, ні 7za.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.