EXR: 무손실 압축
게시일: 2021년 8월 4일
OpenEXR 이미지 파일 포맷에서 제공하는 다양한 무손실 압축 옵션을 살펴보던 중, 주요 압축 방식인 Zip과 PIZ에 대한 성능 차이를 직접 테스트해보았습니다. 기존 문서(예: "Technical Introduction to OpenEXR")에서는 Zip은 쓰기 속도가 느리지만 읽기 속도가 빠르고, PIZ는 쓰기 속도가 빠르지만 읽기 속도가 Zip보다 느리다고 설명하고 있습니다. 하지만 실제로 어느 정도 차이가 있는지 확인해 보았습니다.
테스트 환경
- 하드웨어: MacBook Pro 16" (2019, Core i9 9980HK, 8코어 / 16스레드)
- 소프트웨어: OpenEXR 3.1.1 (Apple Clang 12.0으로 RelWithDebInfo 설정에서 컴파일)
- 테스트 데이터: 18개의 EXR 이미지 (총 1057MB, RGBA 16비트 float)
- 렌더링된 프레임, HDRI 스카이박스, 라이트맵, 반사 프로브 등 다양한 유형 포함
평가 요소
무손실 압축에서는 보통 다음 세 가지 요소가 중요합니다.
- 압축률: 압축률이 높을수록 파일 크기가 작아짐 (예: 압축률 4.0 = 4배 작은 데이터)
- 압축 속도: 데이터를 얼마나 빠르게 압축할 수 있는가?
- 압축 해제 속도: 압축된 데이터를 얼마나 빠르게 읽을 수 있는가?
어떤 요소가 더 중요한지는 사용 사례에 따라 다릅니다.
- EXR 파일을 자주 읽고 한 번만 저장하는 경우 (예: HDRI 텍스처) → 읽기 속도가 중요
- 한 번 저장하고 여러 번 읽지 않는 경우 (예: 렌더링 후 영상 인코딩) → 쓰기 속도가 중요
- 스토리지 또는 네트워크 속도가 느린 경우 → 압축률이 중요
초기 테스트 결과 (멀티스레드 비활성화)
(※ 클릭하여 대화형 차트 보기: 링크)
- 비압축 EXR
- 쓰기 속도: 400 MB/s
- 읽기 속도: 1400 MB/s
- Zip 및 PIZ 압축률: 약 2.4배
- Zip 및 PIZ 성능: 매우 느림 (쓰기 및 읽기 속도 모두 저조)
문제점:
기본적으로 OpenEXR 라이브러리는 단일 스레드(single-threaded) 로 동작합니다. EXR 포맷은 PNG와 달리 내부적으로 이미지를 작은 블록으로 나누어 병렬 압축이 가능하지만, 기본 설정에서는 이를 활용하지 않습니다.
따라서 Imf::setGlobalThreadCount() 함수를 호출하여 멀티스레드를 활성화한 후 다시 테스트를 진행했습니다.
멀티스레드 활성화 후 결과
(※ 클릭하여 대화형 차트 보기: 링크)
- 압축률:
- Zip과 PIZ 모두 2.4배 수준
- 쓰기 속도:
- PIZ: 600 MB/s (비압축 EXR보다 빠름!)
- Zip: 200 MB/s (비압축 대비 2배 느림)
- 읽기 속도:
- Zip: 1600 MB/s (비압축과 비슷)
- PIZ: 1200 MB/s (Zip보다 약간 느림)
- 기타 압축 방식:
- RLE: 빠른 속도(쓰기 및 읽기)지만 압축률이 낮음 (1.7배)
- Zips: Zip보다 약간 빠르지만 압축률이 다소 낮음
결론: 어떤 압축 방식을 선택할 것인가?
1. EXR을 빠르게 저장하고 싶다면? → PIZ 추천
- PIZ는 쓰기 속도가 가장 빠름 (비압축보다 1.5배 빠름)
- 단, 읽기 속도는 Zip보다 약간 느림
2. EXR을 빠르게 읽고 싶다면? → Zip 추천
- Zip은 읽기 속도가 비압축과 동일한 수준
- 그러나 쓰기 속도는 느림
3. 스토리지 공간이 제한적이라면? → Zip 또는 PIZ 모두 가능
- 둘 다 압축률은 2.4배 수준으로 동일
4. CPU 성능이 부족하거나 메모리 사용량이 중요한 경우? → RLE 고려
- RLE는 압축률이 낮지만 빠른 쓰기/읽기가 필요할 때 유용
추가 고려 사항
압축 방식 선택 시, 단순한 속도 비교 외에도 다음과 같은 요소를 고려할 필요가 있습니다.
- 메모리 사용량
- 랜덤 액세스 지원 여부 (특정 부분만 빠르게 읽기 가능 여부)
- 압축/해제 알고리즘의 복잡도
위 테스트에서는 성능 및 압축률을 중심으로 비교하였으며, 특정 작업 환경에서는 추가적인 고려가 필요할 수 있습니다.
'Nuke > 개발' 카테고리의 다른 글
폰트 (0) | 2025.02.26 |
---|---|
Callbacks (0) | 2025.02.19 |
Command Line Operations (0) | 2025.02.19 |
HTML in Nuke (0) | 2024.12.17 |
nuke의 다양한 개발방식?들 (0) | 2024.12.07 |