본문 바로가기
Artificial Intelligence/60. Python

[PYTHON] AI 데이터 저장 시 Parquet가 CSV보다 유리한 7가지 이유와 성능 차이 해결 방법

by Papa Martino V 2026. 4. 19.
728x90

 

CSV와 Parquet의 아키텍처
CSV와 Parquet의 아키텍처

 

데이터 엔지니어링과 머신러닝 워크플로우에서 가장 흔히 마주하는 병목 현상은 의외로 모델의 연산 속도가 아닌 '데이터 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"
728x90