Skip to main content
Pandas 병목은 CPU보다 메모리에서 먼저 발생하는 경우가 많습니다. 대용량 테이블에서는 로딩 전략과 dtype 최적화만으로도 처리 시간을 크게 줄일 수 있습니다.

메모리 프로파일링

baseline = df.memory_usage(deep=True).sum() / 1024**2
print(f"baseline: {baseline:.2f} MB")

dtype 다운캐스팅

int_cols = df.select_dtypes(include=["int64"]).columns
float_cols = df.select_dtypes(include=["float64"]).columns

df[int_cols] = df[int_cols].apply(pd.to_numeric, downcast="integer")
df[float_cols] = df[float_cols].apply(pd.to_numeric, downcast="float")

category 활용

for c in ["region", "device", "segment"]:
    df[c] = df[c].astype("category")
고유값 개수가 적은 문자열 컬럼은 category로 바꾸면 메모리 절감 효과가 큽니다.

chunk 기반 로딩

chunks = pd.read_csv("events.csv", chunksize=200_000)
agg = []
for chunk in chunks:
    part = chunk.groupby("event_type")["amount"].sum()
    agg.append(part)
result = pd.concat(agg).groupby(level=0).sum()

적용 순서

  1. 컬럼별 메모리 상위 10개를 먼저 확인합니다.
  2. 정수/실수 다운캐스팅을 우선 적용합니다.
  3. 저카디널리티 문자열을 category로 전환합니다.
  4. 그래도 부족하면 chunk 처리로 전환합니다.

이어서 볼 문서