본문 바로가기

파일 형식 백과사전

커진 CSV를 gzip으로 압축하기, 얼마나 줄고 압축한 채로 바로 읽을 수 있을까?

로그나 내역 데이터를 CSV로 쌓다 보면 파일이 수십 메가바이트까지 불어납니다.

텍스트라 압축이 잘 먹는데, 그렇다고 매번 압축을 풀었다 다시 읽자니 번거롭습니다.

 

그래서 두 가지가 궁금해집니다. gzip으로 묶으면 얼마나 줄고, 압축을 풀지 않은 채로 바로 읽을 수는 없을까? 테스트 했습니다.

 

결론부터 말하면 CSV는 gzip으로 4배 넘게 줄고,

압축을 풀지 않고도 그대로 읽을 수 있습니다.

실제 데이터로 확인해 보겠습니다.

 

 

20만 행 CSV로 압축률을 재 봤습니다

도시, 상태, 금액처럼 반복되는 값이 섞인 20만 행짜리 CSV를 만들어

일반 저장과 gzip 저장을 나란히 비교했습니다.

 

측정 환경은 윈도우 11, 파이썬 3.14.3, pandas입니다.

저장 방식 용량 원본 대비
일반 CSV (.csv) 7.5 MB 100%
gzip 압축 (.csv.gz) 1.7 MB 23%

 

같은 내용인데 gzip으로 저장하니

원본의 23%, 약 4.4배 작아졌습니다.

 

CSV는 같은 단어(도시명, 상태값)가 수없이 반복되는 텍스트라,

반복을 찾아 줄이는 gzip 압축과 궁합이 좋습니다.

 

저장은 옵션 한 줄이면 됩니다

pandas로 저장할 때 compression="gzip"만 붙이면 압축 파일이 만들어집니다.

파일 이름을 .csv.gz로 두는 것이 관례입니다.

import pandas as pd

# 일반 저장
df.to_csv("data.csv", index=False)

# gzip 압축 저장
df.to_csv("data.csv.gz", index=False, compression="gzip")

핵심: 압축을 풀지 않고 그대로 읽습니다

가장 편한 지점이 여기입니다. 압축 파일을 따로 풀어 둘 필요 없이,

읽을 때 같은 옵션만 주면 pandas가 알아서 풀어 읽습니다.

 

df = pd.read_csv("data.csv.gz", compression="gzip")
# 200,000행 읽기 성공, 0.28초

실제로 20만 행이 문제없이 읽혔고, 원본 데이터와 비교하니 완전히 일치했습니다.

압축했다고 값이 바뀌거나 손상되는 일은 없습니다.

gzip은 원본을 그대로 복원하는 무손실 압축이기 때문입니다.

 

게다가 파일 이름이 .gz로 끝나면 옵션을 생략해도 됩니다.

pandas가 확장자를 보고 압축 파일임을 알아채기 때문입니다.

df = pd.read_csv("data.csv.gz")   # compression 생략해도 자동 인식

즉 압축된 CSV를 마치 일반 CSV처럼 다룰 수 있습니다.

저장 공간은 아끼면서 다루는 방식은 그대로인 셈입니다.

 

언제 gzip으로 저장하면 좋을까

이럴 때 추천
자주 열어 편집하는 작업용 파일 일반 CSV
오래 보관하거나 다른 곳으로 전송할 데이터 gzip 압축
용량이 커서 저장 공간이 부담될 때 gzip 압축

보관이나 전송이 목적이면 gzip, 엑셀로 바로 열어 봐야 하면 일반 CSV가 편합니다.

엑셀은 .gz를 바로 못 여니,

사람이 자주 열 파일은 압축하지 않는 편이 낫습니다.

 

자주 묻는 질문

Q. gzip 말고 다른 압축도 되나요?
됩니다. pandas는 zip, bz2, xz 등도 지원합니다. gzip이 속도와 압축률의 균형이 좋아 가장 흔히 쓰이고, 더 작게 줄이고 싶으면 xz를 고려할 수 있습니다.

 

Q. 압축 파일을 압축 프로그램으로도 열 수 있나요?
네. .csv.gz는 표준 gzip 형식이라 반디집이나 7-Zip 같은 프로그램으로 풀면 안에 일반 CSV가 들어 있습니다.

 

Q. 이미 이미지나 압축 파일이 든 데이터도 이만큼 줄어드나요?
아닙니다. 위 결과는 반복이 많은 텍스트 CSV라 크게 준 것입니다. 이미 압축된 내용이 담긴 데이터는 gzip으로 다시 묶어도 잘 줄지 않습니다.

 

CSV는 압축 여지가 큰 텍스트라, gzip 한 번으로 용량을 크게 덜면서도 다루는 방식은 그대로 둘 수 있습니다.

오래 보관하거나 주고받을 CSV가 있다면 to_csv에 옵션 한 줄만 더해 보세요.

 

읽을 때는 지금처럼 그대로 불러오면 됩니다.