캐시 저장 전 Python 객체 압축이 필요한 순간
리스트, 딕셔너리, 문자열 같은 Python 객체를 캐시에 저장하기 전에 압축하고, 캐시에서 읽어온 후에는 다시 압축을 해제해야 하는 경우가 종종 있습니다. 대용량 데이터를 다룰 때 특히 유용한 기법입니다.
압축이 정말 필요한지 먼저 확인하세요
구현에 앞서 가장 먼저 점검해야 할 것은 해당 객체에 압축이 실제로 필요한지 여부입니다. 데이터 구조나 객체가 압축하지 않고는 캐시에 담기기 어려울 만큼 큰지 확인해야 합니다.
압축과 압축 해제 과정에는 항상 CPU 오버헤드가 발생합니다. 따라서 이 비용이 캐싱을 통해 얻는 성능 향상보다 크지 않은지 반드시 트레이드오프를 고려해야 합니다. 무조건적인 압축은 오히려 전체 성능을 저하시킬 수 있습니다.
zlib 모듈로 객체 압축하기
압축이 실제로 필요하다고 판단되면 Python 표준 라이브러리의 zlib 모듈을 사용하는 것이 가장 간단하고 효율적인 방법입니다.
import zlib
# 객체 직렬화 후 압축
data = "compress me".encode("utf-8")
compressed = zlib.compress(data)
# 캐시에서 읽어온 후 압축 해제
original = zlib.decompress(compressed)압축 레벨로 CPU 시간과 압축률의 균형 맞추기
zlib을 사용할 때는 compress 메서드가 제공하는 다양한 압축 레벨을 실험해 보는 것이 좋습니다. 상황에 따라 최적의 균형점이 달라지기 때문입니다.
zlib.compress(string[, level])string에 담긴 데이터를 압축하여 압축된 데이터를 포함한 문자열을 반환합니다. level 매개변수는 1부터 9까지의 정수로 압축 수준을 조절합니다.
- 1: 가장 빠르지만 압축률이 가장 낮음
- 9: 가장 느리지만 압축률이 가장 높음
- 기본값: 6 (속도와 압축률의 중간 지점)
처리 중 오류가 발생하면 예외(exception)가 발생하므로, 실제 서비스에서는 try-except 구문으로 감싸 안전하게 처리하는 것을 권장합니다.