지난번에는 압축시 한번은 생각해 볼 압축 비밀번호와 유니코드 파일이름에 대해 이야기 했습니다.
이번에는 압축 프로그램을 좀 더 효율적으로 사용하기 위한 정보를 올려봅니다.

저는 압축 프로그램의 기본적인 성능측정 잣대를 5가지로 봅니다.
  1. 압축 후 얼마나 작게 만들어주는가
  2. 압축시 걸리는 시간
  3. 해제시 걸리는 시간
  4. 압축시 필요한 메모리 크기
  5. 해제시 필요한 메모리 크기
위 요소 중에서 사용자들이 가장 체감적으로 느끼는 것은 1,2, (3) 입니다. 그래서 이번 글에서는 1,2,3번에 중점을 두어 압축프로그램들의 벤치마크를 하고, 요즘 사용되는 멀티코어와 대용량의 메모리를 가지는 시스템과의 연관성에 대한 결과를 살펴 보도록 하겠습니다.

테스트 한 예제 파일
  1. 다량의 그림파일과 압축파일이 들어있는 1.31GB(1412160010)의 어느 홈페이지
  2. Google Earth for OSX, Gimp 2.6.8 source code, Maximum Compression사이트의 full_testset테스트파일, 제가 수정한 CleanArchiver 프로그램이 들어있는 약400MB(416703838) 테스트셋
우선 위 파일들은 각각 중복성을 가지게 하기 위해서 내부에 자신의 사본을 2벌씩 가지게 했습니다. 이후 솔리드 압축에서 결과의 차이를 볼 수 있습니다. 그리고 1번 테스트셋은 압축이 이미 거의 된 결과물이고 2번은 압축이 매우 잘 되는 파일이 많이 들어 있어서 테스트 후 결과를 비교하기 위해 설정했습니다.

테스트는 4GB메모리에 쿼드코어 제온 E5355 이 2개 들어가 있고 Windows 2003 R2 x86버전이 설치된 시스템을 사용했습니다. 아쉽게도 64비트 운영체제가 없어서 64비트일때의 차이는 테스트에 고려할 수 없었습니다. 그리고 7zip의 일부 압축률에서의 테스트는 압축시 필요로 하는 총 메모리의 부족으로 테스트 할 수 없었습니다.

테스트에 이용한 압축 프로그램들과 이용한 포멧의 종류는 아래와 같습니다.
일부 생소한 압축 프로그램이 등장하는데요, 결과에서 좋은 정보를 드리기 위해서 추가했습니다. nanozip은 LZPF, LZHD 알고즘을 사용했고, quad, balz는 ROLZ알고리즘을 사용합니다.

그 이외에는 각각의 프로그램들에서 주로 내세우는 압축 포멧을 이용해서 벤치마크에 사용했습니다. 테스트시 사용한 스크립트는 4NT에서 타이머 함수를 가지고 측정했으며 첨부파일을 받아서 직접 해 보실수 있습니다. balz와 quad는 단일파일 압축만 지원하기 때문에 디렉토리 결과를 파악시 7z의 tarball을 이용해 묶은 시간을 벤치마크에 포함했습니다.

이제 본격적으로 벤치마크 결과에 대해서 살펴보도록 하겠습니다. 테스트 결과 택스트 파일을 올립니다.

아래 그래프들은 위 첨부 데이터 중 멀티쓰레드가 모두 가능한 기본적인 시스템 상황에서 각 압축프로그램들의 기본 설정사항에서 압축률만 옵션으로 변화를 주어 압축한 결과를 나타낸 것입니다. 단, 7-zip의 bzip2 알고리즘을 이용한 경우는 보통 압축률에 쓰레드 갯수를 1,2,4,8개로 한 결과입니다. nanozip은 LZPF,LZPF_large, LZHD, LZHDS알고리즘을 지정하고 각각의 결과를 함께 나타냈습니다. 그리고 2번 테스트셋을 하나의 tarball로 묶은 후 그것을 같은 방식으로 압축한 결과를 원래의 2번 테스트셋과 비교하기 위해서 3번째 그래프로 올립니다.

그림의 순서는 압축과 해제결과 각각 차례대로 1번 테스트셋, 2번 테스트셋, 2번 테스트셋의 묶음파일입니다. 각각의 그림은 클릭하면 크게 볼 수 있습니다.

다음은 압축시 걸린 시간과 압축결과 파일 크기의 그래프입니다.
1번 테스트셋 종합 압축결과 1번 테스트셋 종합 압축결과
2번 테스트셋 종합 압축결과 2번 테스트셋 종합 압축결과
2번 싱글 테스트셋 종합 압축결과 2번 싱글 테스트셋 종합 압축결과


다음은 해제시 걸린 시간과 압축결과 파일 크기의 그래프입니다.
1번 테스트셋 종합 해제결과 1번 테스트셋 종합 해제결과
2번 테스트셋 종합 해제결과 2번 테스트셋 종합 해제결과
2번 싱글 테스트셋 종합 해제결과 2번 싱글 테스트셋 종합 해제결과
그림에서 가로축은 압축 또는 해제시에 걸린 시간을 나타내고 세로축은 압축한 결과의 크기가 원래보다 몇퍼센트인지를 보여줍니다. 즉 왼쪽 아래 원점에 가까워질수록 높은 압축률 및 좋은 압축&해제 시간을 보이는 것입니다.

위 그림들을 보고 참고할 사항을 나열해보면
  • 솔리드 압축을 이용할 경우 솔리드 블럭 설정이 매우 중요합니다. 이를 너무 작게 잡으면(압축률을 작게 설정시 해당됨) 압축도 잘 되지 않을뿐만 아니라 압축 시간도 많이 걸리게 됩니다.
  • 압축률을 압축프로그램에서 선택시 가급적 '보통'을 선택하는게 시간&용량면에서 평균적으로 유리합니다.가급적 나머지 압축률은 사용하지 말고 '보통'을 주로 사용하시기 바랍니다.
  • 7zip의 경우 솔리드 압축을 사용하기를 적극 권장(실제 기본으로 켜져있음)하며 4개이상의 멀티코어와 3GB이상의 큰 메모리를 가지는 시스템에서는 LZMA2 알고리즘을 이용할 경우 큰 압축&해제시간 향상을 꾀할 수 있습니다. 압축 해제시 LZMA알고리즘보다 훨씬 빠르기 때문에 LZMA2알고리즘 사용을 적극 권장합니다.
  • rar의 경우 적당한 압축효율과 상대적으로 낮은 압축&해제 시간을 가지는 포멧인 것이 나타납니다. 역시 멀티코어의 이득을 보기 때문에 코어가 많을수록 좋은 결과를 보여줍니다. 여기서 나타나지는 않았지만 한가지 장점은 좋은 결과에도 불구하고 적은 메모리를 사용합니다.제가 언급한 성능 고려요소 5가지 부문에서 종합 1위를 준다면 Winrar에게 줄 수 있겠네요. rar도 7-zip과 마찬가지로 압축파일에 추가 수정을 하지 않는다면 솔리드 압축시 시간 손실 거의 없이 용량의 이득을 볼 수 있으므로 권장합니다.
  • 알집의 alz는 압축시 zip의 일반적인 성능을 가지지만, 해제시 일반 zip보다 2배정도 빠른 속도를 가지고 있습니다.
  • 알집의 새로운 포멧인 egg는 압축 & 해제 시간과 압축효율면에서 7zip의 알고리즘을 사용했음에도 불구하고 7zip보다도 쳐지는 모습을 보여주고 있습니다. 흥미로운 점은 egg의 경우 '최적옵션'을 선택시 알집 스스로 자신이 zip의 deflate와 유사한 알고리즘 혹은 LZMA와 유사한 것을 고르게 되는데 아쉽게도 결과는 둘 다 모두 좋지는 않습니다.
  • quad, balz는 멀티쓰레드를 사용하지 않고 rar와 같이 작은 메모리를 사용함에도 불구하고 중상위권에 속하는 좋은 압축률과 압축&해제 시간을 기록했습니다. 거기에 보테어 기본적으로 솔리드 옵션이 없지만 중복된 파일을 모두 하나로 압축해 주었습니다.
  • nanozip은 정말 경이적인 속도와 압축률을 보여줍니다. quad, balz와 같이 멀티쓰레드를 이용하지 않지만 LZPF & LZPF_large의 경우 최상의 압축률과 압축 속도를 보여주어서 nanozip의 귀추가 주목됩니다. 메모리 사용량의 경우 기본적으로 400MB를 압축시 사용하지만 이정도의 성능 향상은 기적이라 할 수 있습니다.

7zip과 rar의 멀티쓰레드 갯수별 결과 그래프가 있는데, 결론을 말하고 생략하겠습니다.
7zip의 LZMA알고리즘은 딱 2개의 쓰레드가 동시에 돌아가면 됩니다. 적으면 큰 성능하락을, 많으면 2개와 별차이가 없습니다.그런 이유로 4개 이상의 멀티코어의 능력을 이용하기 위해서는 LZMA2알고리즘을 반드시 사용해야 합니다. 그리고 압축 해제시에는 언급한데로 LZMA보다 LZMA2가 2배 가까이 빠르며 LZMA와 마찬가지로 쓰레드 갯수에는 영향을 받지 않습니다.

rar도 압축해제시에는 멀티쓰레드의 영향을 받지 않습니다. LZMA2 및 rar 의 경우 4개에서 8개의 쓰레드로 동시에 압축하는 성능 향상은 2개에서 4개의 차이보다 크지 않습니다. 즉 성능 향상은 로그함수적으로 올라갑니다.

pbzip2의 경우는 이와는 달리 쓰레드 갯수=압축성능향상의 비례가 1:1 정비례에 보다 비슷하게 성립합니다. pbzip2해제시에는 멀티쓰레드의 영향은 받지만 압축보다 크지는 않습니다.

위 그림을 비교해보면 얻을 정보가 더 많지만 용두사미로 끝이 나고 말았네요 : )
그래프를 꼼꼼히 비교해서 살펴보시면 많은 정보를 얻을 수 있습니다. 결과 수치를 텍스트 파일로 보면 좀 더 많은 정보를 얻을 수 있지만 그건 추천하지는 않겠습니다.

참고 링크로 Teddy Rogers라는 유저가 Tuts4You.com 에 올린 LZMA vs LZMA2 vs WinRAR64라는 압축 비교 문서를 첨부파일로 올립니다. 문서에는 4코어 CPU를 가진 컴퓨터를 가지고 압축 프로그램에서 사용하는 쓰레드 갯수를 바꿔가면서 실제 CPU사용 현황 및 메모리 사용량 등을 대략 쉽게 보여주기에 제가 벤치마크한 것과 비교하면 좀 더 이해에 도움이 될 듯 합니다.

COLLAGE FACTORY 님의 7-zip 이야기는 압축 알고리즘에 대한 재미있는 내용이 있으니 관심 있으면 읽어보세요.

다른 의견이나 반대의견 또는 하시고 싶은 말씀이 있다면 자유롭게 남겨주시기 바랍니다.
Posted by trip2me
,