매우 큰 (100G) 파일을 압축하는 시간


27

많은 대용량 파일 (80GB)을 압축해야한다는 사실을 알게되었고 시스템이 보여주는 (부족한) 속도에 놀랐습니다. 약 500MB / 분의 변환 속도를 얻습니다. 를 top사용하면 약 100 %의 단일 CPU를 사용하는 것 같습니다.

tar파일 생성 (80G 파일 생성 방법)이 불과 몇 분 (아마도 5 또는 10) 걸렸기 때문에 디스크 액세스 속도가 아니라고 확신 하지만 2 시간 이상이 지난 후에도 간단한 gzip 명령은 여전히 완료되지 않았습니다.

요약해서 말하자면:

tar -cvf myStuff.tar myDir/*

87G tar 파일 생성에 5 분 미만 소요

gzip myStuff.tar

2 시간 10 분이 걸렸으며 55G zip 파일이 생성되었습니다.

내 질문 : 이것이 정상입니까? gzip작업 속도를 높이기위한 특정 옵션이 있습니까? 명령을 연결하고 사용하는 것이 더 빠릅 tar -cvfz니까? I 톱의 참조 pigz- Gzip으로의 병렬 구현 -하지만 나를 위해 옵션이되지 않도록 불행히도 나는, 내가 사용하고있는 컴퓨터에 소프트웨어를 설치할 수 없습니다. 예를 들어이 이전 질문을 참조하십시오 .

나는 이러한 옵션 중 일부를 직접 시도하고 시간을 정하려고하지만 옵션의 "매직 조합"을 누르지 않을 가능성이 높습니다. 이 사이트의 누군가가 속도를 높이는 올바른 트릭을 알고 있기를 바랍니다.

사용 가능한 다른 시험의 결과가있을 때이 질문을 업데이트 할 것입니다. 그러나 특히 유용한 기술을 가진 사람이 있다면 정말 감사하겠습니다. 어쩌면 gzip은 내가 깨달은 것보다 처리 시간이 더 걸릴 수 있습니다 ...

최신 정보

약속 한대로 아래에서 제안하는 트릭을 시도했습니다. 압축 량을 변경하고 파일의 대상을 변경하십시오. 약 4.1GB 타르에 대해 다음과 같은 결과를 얻었습니다.

flag    user      system   size    sameDisk
-1     189.77s    13.64s  2.786G     +7.2s 
-2     197.20s    12.88s  2.776G     +3.4s
-3     207.03s    10.49s  2.739G     +1.2s
-4     223.28s    13.73s  2.735G     +0.9s
-5     237.79s     9.28s  2.704G     -0.4s
-6     271.69s    14.56s  2.700G     +1.4s
-7     307.70s    10.97s  2.699G     +0.9s
-8     528.66s    10.51s  2.698G     -6.3s
-9     722.61s    12.24s  2.698G     -4.0s

예, 플래그를 기본값 -6에서 가장 빠른 것으로 변경하면 -1(내 데이터의 경우) zip 파일의 크기가 거의 변경되지 않고 속도가 30 % 향상됩니다. 동일한 디스크를 사용하든 다른 디스크를 사용하든 본질적으로 차이가 없습니다 (통계적 의미를 얻으려면 여러 번 실행해야합니다).

관심이 있다면 다음 두 스크립트를 사용하여 이러한 타이밍 벤치 마크를 생성했습니다.

#!/bin/bash
# compare compression speeds with different options
sameDisk='./'
otherDisk='/tmp/'
sourceDir='/dirToCompress'
logFile='./timerOutput'
rm $logFile

for i in {1..9}
  do  /usr/bin/time -a --output=timerOutput ./compressWith $sourceDir $i $sameDisk $logFile
  do  /usr/bin/time -a --output=timerOutput ./compressWith $sourceDir $i $otherDisk $logFile
done

그리고 두 번째 스크립트 ( compressWith) :

#!/bin/bash
# use: compressWith sourceDir compressionFlag destinationDisk logFile
echo "compressing $1 to $3 with setting $2" >> $4
tar -c $1 | gzip -$2 > $3test-$2.tar.gz

3 가지주의 사항 :

  1. 내장 명령 에는 GNU 명령보다 옵션 수가 적으므로을 사용 /usr/bin/time하지 마십시오.timebash
  2. --format로그 파일을 쉽게 읽을 수 있지만 옵션을 사용하지 않아도 됩니다.
  3. time파이프 순서로 첫 번째 명령에서만 작동하는 것처럼 보이기 때문에 스크립트에서 스크립트를 사용했습니다 (따라서 단일 명령처럼 보이게했습니다 ...).

이 모든 학습을 통해 제 결론은

  1. -1깃발로 물건을 빠르게 (응답 허용)
  2. 디스크에서 읽는 것보다 데이터를 압축하는 데 훨씬 더 많은 시간이 소요됩니다
  3. 더 빠른 압축 소프트웨어에 투자하십시오 ( pigz좋은 선택 인 것 같습니다).
  4. 압축 할 파일이 여러 개인 경우 각 gzip명령을 자체 스레드에 넣고 사용 가능한 CPU를 더 많이 사용할 수 있습니다 (가난한 사람 pigz)

이 모든 것을 배우도록 도와 주신 모든 분들께 감사드립니다!


이 빠를 있도록 타르 -cvf는 압축을하지 않습니다
parkydr

2
@Floris : 어떤 종류의 데이터를 압축하려고합니까? 부가 정보 : $> gzip -c myStuff.tar | pv -r -b > myStuff.tar.gz기계가 재료를 얼마나 빨리 압축하는지 보여줍니다. side-note2 : 결과를 다른 디스크에 저장하십시오.
akira

3
죄송합니다. 질문을 잘못 읽었습니다. gzip에는 가장 빠른 압축을 선택하는 --fast 옵션이 있습니다
parkydr

1
@parkydr : --fast 옵션은 내가 모르는 것입니다 ... man페이지의 마지막 옵션이며 멀리 읽지 않았습니다 ( '단일 문자 명령'으로 정렬되어 있기 때문에 -#) . 그것은 RTFM을 가르쳐 줄 것입니다! 이것은 내가 시도하는 다음 일이 될 것입니다!
Floris

2
머신에서 적합한 컴파일러를 사용할 수 있고 파일 시스템 권한이 액세스 권한이있는 디렉토리에서 바이너리를 실행하지 못하도록 설정되어 있지 않은 pigz경우, 설치하지 않고도 빌드 한 위치에서 컴파일 하고 실행할 수 있습니다 . 컴파일러가없는 경우 다른 컴퓨터에서 컴파일러를 크로스 컴파일 할 수 있지만 가치가있는 것보다 더 많은 노력을 기울이고 있습니다. (빠르게 실행하려면이 압축이 얼마나
David Z

답변:


27

사용자는 사용 GZIP의 속도를 변경할 수 --fast --best또는 -## 1에서 9까지의 숫자이다 (도 1 (9)는 더 느리지 만 압축하고, 압축 빠른 미만 임). 기본적으로 gzip은 레벨 6에서 실행됩니다.


26

tar가 gzip에 비해 시간이 적게 걸리는 이유는 파일을 단일 파일로 복사 할 때 계산 오버 헤드가 거의 없기 때문입니다. 반면 gzip은 실제로 압축 알고리즘을 사용하여 tar 파일을 축소합니다.

문제는 gzip이 (발견 한대로) 단일 스레드로 제한된다는 것입니다.

여러 스레드를 사용하여 압축을 수행 할 수있는 pigz를 입력하십시오 . 이것을 사용하는 방법의 예는 다음과 같습니다.

tar -c --use-compress-program=pigz -f tar.file dir_to_zip

자매 사이트 에 --use-compress-program 옵션에 대한 간결한 요약이 있습니다 .


답변과 링크에 감사드립니다. 나는 실제로 질문에서 pigz를 언급했습니다.
Floris

이것이 정답입니다 ..!
stolsvik

4

단일 CPU를 약 100 % 사용하고있는 것 같습니다.

이는 I / O 성능 문제가 없지만 압축이 하나의 스레드 만 사용한다는 것을 의미합니다 (gzip의 경우).

다른 도구를 설치하는 데 필요한 액세스 / 계약을 달성하는 경우 7zip은 다중 코어 CPU를 활용하기 위해 다중 스레드를 지원하지만 gzip 형식뿐만 아니라 자체의 gzip 형식으로 확장되는지 확실하지 않습니다.

당분간 gzip 만 사용하고 여러 파일을 압축하는 경우 개별적으로 압축을 시도하면 여러 프로세스를 병렬로 실행하여 더 많은 멀티 코어 CPU를 사용할 수 있습니다. 헤드 이동 지연 시간이 현저 해짐에 따라 I / O 하위 시스템의 용량 근처에 도달하면 즉시 성능이 급격히 떨어집니다 (하나의 프로세스 / 스레드를 사용하는 경우보다 낮아짐). 병목.


입력 해 주셔서 감사합니다. 당신은 나에게 아이디어를주었습니다. (여러분은 공감할 수 있습니다.) 여러 개의 아카이브를 만들 수 있기 때문에 개별 명령을 작성하고 그 뒤에 &시스템을 관리 할 수 ​​있습니다. 각각은 자체 프로세서에서 실행되며 I / O보다 압축에 훨씬 더 많은 시간을 소비하기 때문에 10 개를 모두 수행하는 것과 동일한 시간이 걸립니다. 따라서 단일 스레드 실행 파일에서 "멀티 코어 성능"을 얻습니다.
Floris

1

다음 명령에 표시된 것처럼 일반적으로 성능이 더 빠른 pigz에서 사용 가능한 프로세스 수를 활용할 수 있습니다.

tar cf-아카이브 할 디렉토리 | pigz -0 -p 큰 수> mydir.tar.gz

예-tar cf-patha | pigz -0 -p 32> patha.tar.gz

-p는 실행할 수있는 프로세스 수이므로 게시물에서 제안한 방법보다 빠를 것입니다. 개인적으로 보관할 디렉토리가 많은 수의 작은 파일로 구성된 경우 매우 큰 값을 설정해도 성능이 저하되지 않습니다. 고려되는 기본값은 8입니다. 큰 파일의 경우이 값을 시스템에서 지원되는 총 스레드 수로 설정하는 것이 좋습니다.

32 CPU 머신의 경우 p = 32 값 설정의 예가 도움이됩니다.

0은 아카이브를 압축하지 않고 속도에 초점을 맞추기 때문에 가장 빠른 pigz 압축을 의미합니다. 압축의 기본값은 6입니다.

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