
데이터 엔지니어링과 머신러닝 워크플로우에서 가장 흔히 마주하는 병목 현상은 의외로 모델의 연산 속도가 아닌 '데이터 I/O(입출력)'입니다. 수십 기가바이트(GB)에 달하는 텍스트 기반 CSV 파일을 파이썬으로 로드하다가 RAM 부족(OOM)을 겪거나, 단순한 필터링 작업에 수 분을 허비하는 경험은 누구나 한 번쯤 겪어보았을 것입니다. 본 포스팅에서는 단순한 텍스트 저장 방식인 CSV의 한계를 넘어서, AI와 빅데이터 환경에서 표준으로 자리 잡은 Apache Parquet(파케이) 파일 형식이 왜 필수적인지 분석합니다. 컬럼 지향 저장소의 메커니즘을 이해하고, 파이썬(Pandas, PyArrow)을 활용해 데이터 파이프라인의 효율을 10배 이상 높이는 7가지 실무 해결 방법을 제시합니다.
1. CSV와 Parquet의 아키텍처 및 성능 메커니즘 차이 분석
CSV는 행(Row) 기반 저장 방식이며, Parquet는 컬럼(Column) 기반 저장 방식입니다. 이 단순한 차이가 대규모 AI 학습 데이터셋 처리에서 기하급수적인 성능 차이를 만듭니다.
| 비교 항목 | CSV (Comma Separated Values) | Parquet (Columnar Storage) |
|---|---|---|
| 데이터 저장 방식 | 행(Row) 중심 | 열(Column) 중심 |
| 데이터 타입 보존 | 불가능 (모두 텍스트로 저장) | 가능 (Schema 및 Meta 정보 포함) |
| 압축 효율 | 낮음 (중복 데이터 처리 비효율) | 매우 높음 (컬럼별 최적 압축 알고리즘) |
| 컬럼 선택적 로드 | 불가능 (전체 파일을 읽어야 함) | 가능 (필요한 컬럼만 디스크에서 로드) |
| 분산 처리 적합성 | 낮음 (파일 분할이 어려움) | 매우 높음 (HDFS/Cloud Storage 최적화) |
| 로딩 속도 (I/O) | 느림 (파싱 및 타입 추론 필요) | 매우 빠름 (Binary 레이아웃 직접 로드) |
2. 실무 개발자를 위한 Parquet 활용 및 최적화 Sample Example 7가지
현업에서 AI 모델 학습용 데이터를 관리할 때 즉시 적용 가능한 파이썬 기반의 코드 해결책입니다.
Example 1: Pandas와 PyArrow를 이용한 대용량 데이터 저장 및 압축
Parquet는 Snappy, GZIP, ZSTD 등 다양한 압축 알고리즘을 지원합니다. AI 환경에서는 속도가 빠른 Snappy가 기본적으로 권장됩니다.
import pandas as pd
import numpy as np
# 100만 행의 샘플 데이터 생성
df = pd.DataFrame({
'id': np.arange(1000000),
'feature_a': np.random.randn(1000000),
'category': np.random.choice(['A', 'B', 'C'], 1000000)
})
# [해결] CSV 대비 약 4~5배 적은 용량으로 저장 (Snappy 압축)
df.to_parquet('dataset.parquet', engine='pyarrow', compression='snappy')
print("Parquet file saved successfully.")
Example 2: 필요한 컬럼만 부분 로드하여 메모리 절약하기 (Projection Pushdown)
AI 모델 학습 시 수백 개의 피처 중 특정 피처만 필요할 때, 파일 전체를 RAM에 올리지 않고 선택적으로 읽어옵니다.
# [방법] columns 파라미터를 사용하여 필요한 열만 즉시 로딩
# CSV와 달리 디스크 I/O 단계에서 해당 컬럼만 탐색하므로 매우 빠름
subset_df = pd.read_parquet('dataset.parquet', columns=['feature_a', 'category'])
Example 3: 데이터 파티셔닝(Partitioning)을 통한 쿼리 성능 최적화
날짜나 카테고리별로 디렉토리를 나누어 저장하면, 조건에 맞는 데이터만 건너뛰며 읽을 수 있습니다.
# 'category' 별로 파티션을 나누어 저장 (Hive-style partitioning)
df.to_parquet('partitioned_data', engine='pyarrow', partition_cols=['category'])
# 특정 파티션만 필터링하여 로드 (속도 최적화 해결)
# PyArrow 엔진이 자동으로 불필요한 폴더를 스캔 대상에서 제외함
filtered_df = pd.read_parquet('partitioned_data', filters=[('category', '==', 'A')])
Example 4: 스키마(Schema) 정의를 통한 데이터 무결성 확보
CSV는 로드 시마다 데이터 타입을 추론하지만, Parquet는 스키마를 고정하여 타입 오류를 방지합니다.
import pyarrow as pa
import pyarrow.parquet as pq
# 명시적 스키마 정의
schema = pa.schema([
('id', pa.int64()),
('feature_a', pa.float64()),
('category', pa.string())
])
table = pa.Table.from_pandas(df, schema=schema)
pq.write_table(table, 'schema_fixed.parquet')
Example 5: 카테고리형 데이터의 'Dictionary Encoding' 자동 적용
중복이 많은 문자열 데이터를 내부적으로 정수 인덱스로 변환하여 저장하므로 용량이 획기적으로 줄어듭니다.
# Pandas의 category 타입을 활용하면 Parquet 저장 시 자동으로 인코딩 효율 극대화
df['category'] = df['category'].astype('category')
df.to_parquet('optimized_cat.parquet')
Example 6: FastParquet를 이용한 대규모 데이터 Append
기존 파일에 데이터를 추가로 덧붙여야 할 때 유용한 라이브러리 활용법입니다.
from fastparquet import write
# 기존 파일에 이어서 작성 (append 모드)
new_data = pd.DataFrame({'id': [1000001], 'feature_a': [0.5], 'category': ['B']})
write('dataset.parquet', new_data, append=True)
Example 7: Cloud Storage(S3/GCS) 직접 쓰기 및 로드
네트워크 대역폭이 소중한 클라우드 환경에서 Parquet의 압축 용량은 비용 절감의 핵심입니다.
# [실무 팁] s3fs 라이브러리를 설치하면 S3 경로로 직접 read/write 가능
# df.to_parquet('s3://my-ai-bucket/train_data.parquet')
3. 독창적인 고찰: 왜 AI 엔지니어는 Parquet를 '필수'로 여겨야 하는가?
단순히 '속도가 빠르다'는 것 이상의 가치가 있습니다. AI 모델 학습은 대개 반복적(Iterative)입니다. 수천 번의 에포크(Epoch) 동안 데이터를 반복해서 읽어야 하는 딥러닝 환경에서 I/O 효율은 전체 학습 시간을 30% 이상 단축할 수 있습니다.
또한, Parquet는 'Predicate Pushdown'이라는 기술을 지원합니다. 이는 "성적이 90점 이상인 학생 데이터만 가져와"라는 요청을 보냈을 때, DB 엔진처럼 파일 내부의 메타데이터(Min/Max 값 등)를 보고 아예 데이터 블록을 읽지 않고 건너뛰는 기술입니다. 텍스트를 한 줄 한 줄 파싱해야 하는 CSV에서는 절대 불가능한 최적화입니다.
4. 결론 및 요약
성능 차이를 해결하고 데이터 파이프라인을 현대화하기 위해 다음 전략을 권장합니다.
- 용량 절감: CSV 대비 최소 50%에서 최대 90%까지 디스크 공간을 절약하십시오.
- 속도 개선: 필요한 컬럼만 읽어 메모리 효율을 극대화하십시오.
- 신뢰성 확보: 스키마 정보를 파일에 내장하여 '숫자가 문자로 읽히는' 불상사를 방지하십시오.
- 비용 최적화: 클라우드 환경에서 데이터 전송량(Egress)과 저장 비용을 획기적으로 낮추십시오.
정보 출처 및 기술 참조
- Apache Parquet Official Documentation: "Columnar Storage Format"
- Apache Arrow Documentation: "Reading and Writing Parquet files"
- Pandas Performance Guide: "Enhancing Performance with Parquet"
- Databricks Engineering Blog: "CSV vs Parquet - Performance Comparison"
'Artificial Intelligence > 60. Python' 카테고리의 다른 글
| [PYTHON] 불균형 데이터셋 해결을 위한 SMOTE 한계와 7가지 대안 방법 및 성능 차이 (0) | 2026.04.19 |
|---|---|
| [PYTHON] 데이터 드리프트(Data Drift) 탐지를 위한 7가지 통계적 방법과 해결 차이점 (0) | 2026.04.19 |
| [PYTHON] PySpark ETL 과정의 직렬화 오류 해결 방법 7가지와 Python 연동 차이 분석 (0) | 2026.04.19 |
| [PYTHON] 가공된 피처 저장 및 공유를 위한 Feature Store 도입 방법 7가지와 데이터 파편화 해결 차이 (0) | 2026.04.19 |
| [PYTHON] Label Encoding vs One-hot Encoding 선택 방법 7가지와 모델별 성능 차이 해결 (0) | 2026.04.19 |