TIL/멋사_AI스쿨_TIL

221017 AI스쿨 TIL downcast, parquet

둥둥런 2022. 10. 22. 13:23

22일차 멋사 AI스쿨 main lecture by 박조은 강사님

오늘의 키워드는 절약

1) 메모리절약 => downcast, 2) 스토리지 절약(디스크공간) => parquet

 

Downcast 실습

먼저 자료형에 대해 자세히 알아보았다.

int64와 int32의 차이, uint, float 등

같은 숫자 자료형 안에서도 정수형인지 실수형인지만 구분할 뿐만 아니라, 표현할 수 있는 범위가 다르다.

출처_ https://github.com/rougier/numpy-tutorial#quick-references

예를 들어 어떤 일련번호의 원래 데이터형은 int64이고,

최소값은 666668, 최대값은 999987 이고 앞으로 음수는 사용하지 않는다고 가정할 때

어떤 데이터 타입을 사용하면 적절할까? -> unit32가 적절하다.

 

데이터의 범위(int64, uint32 등)에 따라 메모리에서 차지하는 용량이 다르다.

현업에서 다루는 데이터는 실습에서 다루는 데이터보다 훨씬 큰 용량이기 때문에 컴퓨터 RAM 용량만큼 더 많은 데이터를 불러와서 분석하거나 모델을 만들기 위해서 메모리를 효율적으로 사용할 수 있어야 한다.

DB에서는 스키마에 지정을 해서 용량을 관리할 수 있지만 CSV 파일에는 데이터 형식이 없다.

(CSV는 쉼표(,)로 구분한 텍스트 데이터 및 텍스트 파일이다)

그래서 데이터를 불러온 뒤 downcast를 활용하면 메모리 용량을 줄일 수 있다

- df.info()를 통해 데이터 타입 확인

#조건문과 반복문 활용 int, float , object 타입에 대해 downcast를 진행하기
for col in df.columns:
    print(df[col].dtypes.name)
    dtype_name =df[col].dtypes.name
    if  dtype_name.startswith("int"):
        if df[col].min() > 0:
            df[col] = pd.to_numeric(df[col], downcast="unsigned")
        else:
            df[col] = pd.to_numeric(df[col], downcast="integer")
    elif dtype_name.startswith("float"):
        df[col] = pd.to_numeric(df[col], downcast="float")
    elif dtype_name == "bool":
        df[col] = df[col].astype("int8")
    elif dtype_name == "object":
        df[col] = df[col].astype("category")
print(df[col].dtypes.name)

Apache Parquet 실습

아파치 파케이는 효율적인 데이터 저장 및 검색을 위해 설계된 오픈소스이다.

열 지향 데이터 파일 형식으로 저장한다.

복잡한 데이터를 대량으로 처리하기 위해 효율적인 데이터 압축 및 인코딩 체계를 제공한다.

 

csv저장과 parquet 저장 크기의 차이

- 파일에 데이터가 매우 적다면 단순한 csv보다 메타데이터를 포함하고 있는 parquet의 용량이 클 수 있다.

- 하지만 데이터가 매우 많다면 paequet로 저장한 파일의 크기가 훨씬 작고, 효율적이다.

 

파일 사이즈를 크기+단위로 표현하는 반복문

# 파일 사이즈 bytes 로 표기하기
def convert_bytes(num):
    """
    1024 보다 크면 숫자를 나누고 아니면 숫자와 단위를 표시하도록
    for문을 돌면서 값을 1024로 나누고 
    값이 1024 보다 작다면 단위와 함께 num 을 반횐
    """
    for file_size in ["bytes","KB","MB","GB","TB"]:
        if num < 1024:
            return f"{num:.2f} {file_size}"
        num /= 1024
    

def file_size(file_path):
    """
    파일이 있다면 convert_bytes 함수를 통해 크기를 구함
    """
    if os.path.isfile(file_path):
        file_info = os.stat(file_path)
        return convert_bytes(file_info.st_size)

# 결과 확인
file_size(file_path_parquet), file_size(file_path_csv), file_size("")

자리수 소수점 두자리 표현 :.2f

elif file_size =='TB': return (f'{num:.2f} {file_size}')

num이 더큰수라면 추가

Streamlit dashboard

서버종료 Ctrl+C

 


오늘의 회고

  • 사실(Fact) : 메모리 절약을 위한 downcast, 스토리지 절약을 위한 parquet
  • 느낌(Feeling) : 월요일이라 지치지만 미드프로젝트를 위해 힘내야겠다.
  • 교훈(Finding) : 주말에 티스토리가 터지고, 미니프로젝트를 하느라, 수업 복습, TIL정리를 못해서 오늘 열심히 해봐야겠다