7za의 다중 스레드 지원 (p7zip) 9.20을 사용하여

(이것은 serverfault에 처음 게시했지만 여기에 속하는 것 같습니다.)

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


답변

에 따르면 -m (설정 압축 방법) 스위치 # ZipMultiThread – 7zip과 매뉴얼 및 문서 , mt기본값 on, 그래서 전혀를 지정할 필요가 없습니다.

그러나 7zip의 DEFLATE 알고리즘 구현은 멀티 스레딩을 지원하지 않습니다!

이미 발견했듯이

7za a archive.zip bigfile

하나의 코어 만 사용합니다.

그러나 .zip파일은 모든 파일을 개별적으로 압축합니다. 여러 파일을 압축 할 때 멀티 스레딩 옵션은 코어 당 한 파일을 한 번에 압축합니다.

그것을 시도하고 당신은 그것을 볼 수 있습니다

7za a archive.zip bigfile1 ... bigfileN

사용 가능한 모든 N코어 를 사용합니다 .

단일 파일 의 압축 속도를 높이려면 다음 두 가지 중에서 선택할 수 있습니다.

  1. 분할 bigfile덩어리.

  2. 다른 압축 알고리즘을 사용하십시오.

    예를 들어, 7zip의 BZip2 알고리즘 구현은 멀티 스레딩을 지원합니다.

    구문은 다음과 같습니다.

    7za a -mm=BZip2 archive.zip bigfile
    

또한 .zip컨테이너에 LZM 알고리즘을 사용하려고하면 구문 오류가 발생합니다 . 그건 불가능하다.

.zip코나 티너에 가능한 알고리즘 은 DEFLATE (64), BZip2이며 압축되지 않습니다.

LZM 알고리즘을 사용하려면 .7z컨테이너를 사용하십시오 . 이 컨테이너는 PPMd, BZip2, DEFLATE, BCJ, BCJ2 및 압축되지 않은 알고리즘도 처리합니다.


답변

이것은 오래된 질문이며 특정 질문에 대한 답변이 아니라 질문의 정신에 대한 답변입니다 (모든 코어를 사용하여 zip 형식 압축)

pigz (.zip 옵션이있는 병렬 gzip)

pigz -K -k archive.zip bigfile txt

이렇게하면 동일한 압축 수준에서 7 배 더 빠른 zip 호환 파일이 제공됩니다.

단일 및 다중 코어를 사용하는 zip 호환 및 비 -zip 압축기의 빠른 비교.

fedora 20에서 1.0gb txt 파일을 압축하는 i7-2600k의 월 타임

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

답변

-mmt [N + 1]을 사용하십시오.

예를 들면 다음과 같습니다. -mmt2는 하나의 스레드이고 -mmt9는 8 개의 스레드입니다.


답변

확인 및 테스트 : 7za에서 멀티 스레딩을 사용하려면 매개 변수는 “-mmt = #”이 아니라 “-mmt #”이어야합니다. 등호를 넣으면 무시됩니다.

내가 어떻게 발견 했습니까? 매개 변수없이 7z를 실행하면 매개 변수에 대한 정보가 표시되고 스위치에서 “-mmt = [N]”이 아니라 “-mmt [N]”이라고 표시됩니다.

따라서 잘 이해하면 “-mmt = 2″를 입력하는 매개 변수가 등호없이 입력되지 않거나 “-mmt2″일 수 있습니다.

내가 잘 이해하는지 확실하지 않으면, 나의 영어는 정말로 가난합니다.

그런데 왜 “7z”대신 “7za”를 사용합니까?

그래서 매개 변수를 테스트하기 위해 벤치 마크를 수행하는 명령 세트를 실행하고 일부 문서에서 오타 오류를 확인했습니다. 등호없이 올바른 매개 변수를 입력해야합니다.

스레드가 하나만있는 7z에서 벤치 마크를 수행하는 명령 : 7z b -mmt1

스레드가 2 개인 7z에서 벤치 마크를 수행하는 명령 : 7z b -mmt2

스레드가 2 개인 7za에서 벤치 마크를 수행하는 명령 : 7za b -mmt2

스레드가 하나만있는 7za에서 벤치 마크를 수행하는 명령 : 7za b -mmt1

ˋ-mmt # ˋ 매개 변수에는 등호가 없으며 7z 또는 7za에는 없습니다.