수십 메가바이트가 넘는 CSV를 pd.read_csv로 불러올 때마다
몇 초씩 기다리게 되면, 분석을 반복할수록 그 시간이 쌓입니다.
그런데 같은 파일이라도 읽는 방법을 조금만 바꾸면 훨씬 빨라집니다.
무엇을 바꾸면 얼마나 빨라지는지 실제로 재 봤습니다.

100만 행 CSV로 방법을 비교했습니다
id, 도시, 금액 등 6개 열에 100만 행,
약 40MB짜리 CSV를 만들어 네 가지 방법으로 읽어 시간을 쟀습니다.
측정 환경은 윈도우 11, 파이썬 3.14.3, pandas와 pyarrow입니다.
각 방법을 여러 번 실행해 가장 빠른 값을 적었습니다.
| 읽는 방법 | 시간 | 기본 대비 |
|---|---|---|
| 기본 read_csv | 1.01초 | 기준 |
| dtype 지정 | 0.85초 | 1.2배 빠름 |
| usecols로 필요한 3열만 | 0.71초 | 1.4배 빠름 |
| engine="pyarrow" | 0.09초 | 약 11배 빠름 |
시간은 컴퓨터 상태에 따라 달라지지만,
방법 간의 순서와 격차는 여러 번 돌려도 비슷하게 유지됐습니다.
방법 1: 열의 타입을 미리 알려 준다
pandas는 CSV를 읽을 때 각 열이 숫자인지 글자인지 스스로 훑어 추측합니다.
이 추측에 시간이 걸립니다.
dtype으로 타입을 미리 알려 주면 그 과정을 건너뛰어 조금 빨라지고,
무엇보다 메모리를 크게 아낍니다.
dtypes = {
"id": "int32",
"city": "category", # 반복되는 문자열은 category가 효율적
"status": "category",
"amount": "int32",
}
df = pd.read_csv("big.csv", dtype=dtypes)
실제로 이 데이터에서 메모리 사용량이
68MB에서 29MB로 절반 아래까지 줄었습니다.
도시나 상태처럼 같은 값이 반복되는 열을 category로 지정한 효과가 큽니다.
방법 2: 필요한 열만 읽는다
분석에 세 개 열만 쓴다면 나머지를 읽을 이유가 없습니다. usecols로 쓸 열만 지정하면 읽는 양 자체가 줄어 빨라집니다.
df = pd.read_csv("big.csv", usecols=["id", "city", "amount"])
열이 많은 넓은 CSV일수록 이 방법의 효과가 커집니다. 파일을 처음 열어 어떤 열이 있는지 확인한 뒤, 필요한 것만 골라 읽는 습관이 도움이 됩니다.
방법 3: pyarrow 엔진을 쓴다
가장 극적인 차이를 낸 방법입니다. pandas는 CSV를 해석하는 엔진을 고를 수 있는데, engine="pyarrow"를 쓰면 여러 코어를 활용해 훨씬 빠르게 읽습니다.
df = pd.read_csv("big.csv", engine="pyarrow")
이 실험에서는 기본보다 약 11배 빨랐습니다. 다만 pyarrow가 설치돼 있어야 하고, 일부 세부 옵션은 기본 엔진과 동작이 다를 수 있어, 큰 파일을 단순히 빠르게 불러올 때 특히 유용합니다.
파일이 메모리보다 클 때: 나눠 읽기
파일이 너무 커서 한 번에 올리면 메모리가 부족하다면,
chunksize로 잘라 읽습니다.
정해진 행 수만큼씩 나눠 처리하므로 메모리를 아낄 수 있습니다.
total = 0
for chunk in pd.read_csv("big.csv", chunksize=100_000):
total += chunk["amount"].sum() # 조각마다 부분 합산
이 방식은 속도를 위한 것이 아니라, 통째로 올릴 수 없을 만큼 큰 파일을 다루기 위한 방법입니다.
그래서 무엇부터 적용할까
큰 파일을 빠르게 읽는 게 목적이면 engine="pyarrow"를 먼저,
메모리가 부담이면 dtype 지정과 usecols를 함께 쓰면 됩니다.
파일이 메모리를 넘길 정도로 크면 chunksize로 나눠 읽습니다.
자주 묻는 질문
Q. pyarrow 엔진이 항상 빠른가요?
큰 파일에서 특히 효과가 큽니다. 작은 파일은 차이가 미미하고, 기본 엔진에만 있는 일부 옵션을 쓰면 그대로 두는 편이 나을 수 있습니다.
Q. dtype을 잘못 지정하면 어떻게 되나요?
값이 지정한 타입에 안 맞으면 읽다가 오류가 납니다. 확실한 열부터 지정하고, 애매하면 비워 두어 pandas가 추측하게 하면 됩니다.
Q. 매번 CSV로 읽는 게 느리면 다른 방법은요?
같은 데이터를 반복해 읽는다면 한 번 Parquet로 저장해 두는 방법이 있습니다. Parquet는 열 단위로 저장돼 읽기가 빠르고 용량도 작습니다.
같은 CSV라도 타입을 알려 주고, 필요한 열만 고르고, 빠른 엔진을 쓰면
기다리는 시간이 크게 줄어듭니다.
지금 자주 읽는 큰 CSV가 있다면 engine="pyarrow" 한 줄부터 더해 시간을 비교해 보세요.
'파일 형식 백과사전' 카테고리의 다른 글
| 사진 용량 줄일 때 해상도를 줄일까 화질을 낮출까, 무엇이 더 효율적인지 실측 (0) | 2026.07.18 |
|---|---|
| ZIP 압축을 풀었더니 파일명이 ║╕░φ╝¡ 처럼 깨질 때, 원인과 해결 (1) | 2026.07.16 |
| 같은 사진을 WebP, AVIF, JPG로 저장하면 용량이 얼마나 차이 날까 (직접 측정 후기) (0) | 2026.07.15 |
| 같은 폴더를 ZIP, 7Z, TAR.GZ로 압축하면 용량이 얼마나 다를까, 3종 직접 측정 (0) | 2026.07.14 |
| XML로 받은 데이터를 JSON으로 바꾸고 싶을 때, 표준 라이브러리만으로 해결하기 (0) | 2026.07.13 |