Today I Learned

대용량 파일 관리 - parquet, downcast

by Holly Yoon

TIL

  • storage, memory 사이즈를 줄여야하는 이유
    • “데이터를 저장하는 것” 자체가 “비용”이기 때문에
    • 데이터가 누적이 될수록 파일 사이즈는 증가하기 때문에
    • 주고 받기 편하게 하기 위해서
    • 시간, 메모리 사용량 , 비용 등등 자원 절약을 위해
    ex) 노트북을 구매하기 위해 용량을 1T, 2T 등을 고민할 수 있는데 용량에 따라 비용이 20~30만원까지 차이가 납니다.
  • 기업에서는 Log를 쌓을 때 데이터 엔지니어는 시간 단위로 파일을 저장할 것인지 , 어떤 기준, 어떤 도구로 데이터를 저장할 것인지를 고민하게 된다.
  • Parquet을 쓰자
    • csv는 행 단위로 저장하지만, parquet은 컬럼단위로 저장을 한다.
    • 동일한 데이터 타입을 할 때, 압축&저장에 유리하다.
  • Parquet로 저장하고, 사이즈 비교해보기
file_path_parquet = 'df.parquet.gzip'
file_path_csv  = 'df.csv'

df2.to_parquet(file_path_parquet, compression='gzip')
df2.to_csv(file_path_csv, index=False)

psize=os.stat(file_path_parquet).st_size
csize=os.stat(file_path_csv).st_size
format(psize, ","),format(csize, ",")
  • ETL vs ELT
    • 데이터 프로덕션 시스템에서 추출 → 우리가 원하는 형식으로 변환 → 데이터 웨어하우스에 적재
    • ETL은 추출과 변환이 자동화될 수 없고, 변환이라는게 회사마다 다름
    • 그래서 등장한, 추출해서 일단 적재하고 변환하는 ELT
  • Parquet로 저장하는 함수 만들기
def compare_csv_parquet(df):
    """
    데이터프레임을 csv 와 parquet형식으로 저장하하고 각 파일 사이즈를 dict 형태로 반환
    """
    file_path_parquet = 'df.parquet.gzip'
    file_path_csv  = 'df.csv'
    df.to_parquet(file_path_parquet, compression='gzip')
    df.to_csv(file_path_csv, index=False)
    return({'parquet': file_size(file_path_parquet), 'csv':file_size(file_path_csv)})
compare_csv_parquet(df)
  • Parquet의 특징
    • 무료 오픈 소스 파일 형식
    • 언어를 가리지 않음
    • 컬럼 기반 형식
    • 데이터 압축과 해제의 용이성
    • 모든 종류의 빅데이터를 저장하는데 적합함
  • 메모리를 절약해서 사용하는 방법
    • 사용하지 않는 프로그램 종료
    • 컴퓨터 재부팅
    • 프로그램에서 과도한 메모리 사용 기능을 사용안함으로 변경하기
  • 스키마 : 데이터 베이스에서 자료의 구조, 자료의 표현 방법, 자료간의 관계를 형식 언어로 정의한 구조
  • downcast
    • column의 min, max를 확인하고 용량을 줄여주자.
    for col in df.columns:
        dtypes_name = df[col].dtypes.name
        if dtypes_name.startswith('float'):
            df[col]=pd.to_numeric(df[col], downcast='float')
        elif dtypes_name.startswith('int'): 
            if df[col].min()<0:
                df[col]=pd.to_numeric(df[col], downcast='integer')
            else:
                df[col]=pd.to_numeric(df[col], downcast='unsigned')
        elif dtypes_name.startswith('object'): 
            df[col] = df[col].astype('category')
    
    • 파일사이즈를 효율적으로 관리하는 방법은 parquet
    • 메모리를 효율적으로 관리하는 방법은 downcast
  • 너무 큰 파일은 이렇게 쪼개서 불러올 수 있다.
import pandas as pd
df=pd.read_csv('.csv', dtype={'약품':'category'}, nrows=1000)
df.shape

'TIL' 카테고리의 다른 글

github 시작하기  (0) 2023.03.02
비즈니스 분석 (1) #ARPU #ARPPU  (0) 2023.03.01
[TIL] 내용수집 함수만들기 (pandas)  (0) 2023.01.19
[TIL] 네이버 종목토론실 스크래핑  (0) 2023.01.12
[TIL] 스크랩핑 with Pandas  (0) 2023.01.12

블로그의 정보

Study Log by Holly

Holly Yoon

활동하기