7za의 다중 스레드 지원


18

(이것은 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

나는 옵션이 -mmt아니라고 믿는다 -mmt=2. 또한 올바른 구문은이라고 생각 -mx9하지만 둘 다 작동 할 수 있습니다.
획기적인

고맙지 만 옵션이없는 -mmt는 여전히 하나의 스레드 만 사용합니다. 에 따르면 docs.bugaco.com/7zip/MANUAL/switches/method.htm#ZipMultiThread , 당신은 -mmt = N에 사용할 스레드 수를 지정할 수 있습니다.
Brian L

LZMA / Deflate는 단일 스레드이지만 여전히 사용하는 것이 좋습니다. 당신이하는 동안 는 bzip2 증가 압축 속도를 얻을, 그건 덜 효율적 일반 텍스트를 압축하고, 단일 스레드 변종 느린 LZMA / 공기를 빼다 동등 이상의 경우.
획기적인

@Breakthrough : BZip2는 일반적으로 링크에 표시된 것처럼 DEFLATE보다 더 나은 압축을 달성합니다. 또한 압축 할 때 LZMA보다 훨씬 빠릅니다.
Dennis

답변:


25

에 따르면 -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 및 압축되지 않은 알고리즘도 처리합니다.


@Dennis OP가 LZMA (2)를 사용하고 있다고 생각했는데,이 문서에서 "LZMA 압축은 2 개의 스레드 만 사용합니다." Lempel-Ziv 인코딩의 작동 방식으로 인해 직관적으로 동의하지만 LZMA 또는 Deflate (허프만 인코딩을 사용하는 LZMA)를 멀티 스레딩하는 것은 매우 어렵습니다.
획기적인

1
@Breakthrough : 처음에 나도 그렇습니다. (내 답변의 개정판을 확인하십시오.) 이것이 구문 오류에 관한 것입니다. .zip컨테이너에 LZMA 압축을 사용할 수 없습니다 .
Dennis

@ 데니스 아, 그것을 정리해 주셔서 감사합니다. OP가 .ZIP컨테이너를 사용하고 있음을 보지 못했습니다 .
획기적인

잠깐, 컨테이너의 파일 확장자를 .7z로 변경하면 다른 결과를 얻을 수 있습니까?
Brian L

3
@BrianL에는 "감사"버튼이 내장되어 있습니다. 화살표가 위쪽을 향하는 것 같습니다.)
nhinkle

5

이것은 오래된 질문이며 특정 질문에 대한 답변이 아니라 질문의 정신에 대한 답변입니다 (모든 코어를 사용하여 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

pbzip2 또는 pixz를 할 수 있는데 왜 pigz입니까?
nod

gzip은 bzip2보다 훨씬 빠르기 때문에 추가 압축이 항상 가치가있는 것은 아닙니다.
jesjimher

0

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

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


-1

확인 및 테스트 : 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에는 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.