본문 바로가기

파일 형식 백과사전

수백만 행 CSV를 pandas로 읽는 게 느릴 때, 읽기 속도를 끌어올리는 방법

수십 메가바이트가 넘는 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" 한 줄부터 더해 시간을 비교해 보세요.