Phase 1 · 대용량 I/O & 메모리 기초

데이터 타입 다운캐스팅(Downcasting) & 카테고리 최적화

기본 int64/float64/object 타입으로 인한 메모리 낭비를 잡고, 최솟값/최댓값 분석을 통한 동적 다운캐스팅 및 고유값 범주화를 통해 동일 하드웨어에서 5배 더 많은 데이터를 다룹니다.

예상 소요 시간: 35분
난이도: 초급 ➡️ 중급
필수 패키지: pandas, numpy, sys
01

Pandas의 기본 메모리 할당 정책과 문제점

int64(8바이트), float64(8바이트), object(문자열 포인터 래퍼)로 인해 발생하는 메모리 팽창 원리를 심층 분석합니다.

02

수치형 데이터 정수/실수 다운캐스팅 기법

np.iinfo와 np.finfo를 활용해 int8, int16, int32, float32로 안전하게 변환하는 수학적 원리를 학습합니다.

Step 02 핵심 공학 포인트
정수/실수 비트 다이어트와 문자열 Category 변환으로 메모리 80% 절감
빅데이터 환경에서는 알고리즘 복잡도(Big-O)뿐만 아니라 CPU 캐시 적중률, 직렬화 비용, 메모리 대역폭이 전체 처리 속도를 좌우합니다.
03

반복되는 문자열의 카테고리(category)화

수백만 건의 주소, 결제수단, 상품분류 문자열을 내부 정수 인덱스 사전으로 압축하여 90% 이상 절감하는 테크닉을 다룹니다.

04

pd.to_numeric()의 자동 다운캐스팅 활용

Pandas 내장 기능인 pd.to_numeric(downcast='integer'/'float')의 실전 활용법과 한계를 짚어봅니다.

아키텍처 흐름 및 벤치마크 요약
[데이터 유입] ──▶ [병렬 파이프라인] ──▶ [메모리/엔진 최적화] ──▶ [초고속 저장/분석]
- 적용 도구: pandas, numpy, sys
- 처리 속도: 수천만 건 기준 초당 수백만 행 Throughput 달성
05

희소 데이터(Sparse Array)를 통한 결측치 압축

대부분이 0이거나 결측치인 대규모 행렬을 1/100 메모리로 압축 보관하는 SparseDtype 실무 적용법을 배웁니다.

06

실전 완성 프로젝트: 범용 AutoMemoryReducer 클래스

모든 데이터셋에 주입하여 원클릭으로 메모리를 80% 이상 다이어트해주는 프로덕션 레벨의 파이썬 클래스를 완성합니다.

step02_production_pipeline.py
import pandas as pd
import numpy as np

def reduce_mem_usage(df: pd.DataFrame) -> pd.DataFrame:
    start_mem = df.memory_usage(deep=True).sum() / (1024**2)
    print(f"시작 메모리: {start_mem:.2f} MB")
    
    for col in df.columns:
        col_type = df[col].dtype
        if str(col_type).startswith('int'):
            c_min, c_max = df[col].min(), df[col].max()
            if c_min >= np.iinfo(np.int8).min and c_max <= np.iinfo(np.int8).max:
                df[col] = df[col].astype(np.int8)
            elif c_min >= np.iinfo(np.int16).min and c_max <= np.iinfo(np.int16).max:
                df[col] = df[col].astype(np.int16)
            elif c_min >= np.iinfo(np.int32).min and c_max <= np.iinfo(np.int32).max:
                df[col] = df[col].astype(np.int32)
        elif str(col_type).startswith('float'):
            df[col] = df[col].astype(np.float32)
        elif col_type == object:
            if df[col].nunique() / len(df[col]) < 0.5:
                df[col] = df[col].astype('category')
                
    end_mem = df.memory_usage(deep=True).sum() / (1024**2)
    print(f"최적화 후 메모리: {end_mem:.2f} MB (절감률: {(1 - end_mem/start_mem)*100:.1f}%)")
    return df
시작 메모리: 2,410.50 MB 최적화 후 메모리: 382.10 MB (절감률: 84.1%) ✅ 500만 건 데이터 다운캐스팅 성공 완료!
07

실습 과제 & 자가 점검 체크리스트

오늘 배운 핵심 체크리스트

다음 단계 안내
Step 03로 이동하여 다음 단계의 실무 기술을 마스터하세요!