22일차 멋사 AI스쿨 main lecture by 박조은 강사님
오늘의 키워드는 절약
1) 메모리절약 => downcast, 2) 스토리지 절약(디스크공간) => parquet
Downcast 실습
먼저 자료형에 대해 자세히 알아보았다.
int64와 int32의 차이, uint, float 등
같은 숫자 자료형 안에서도 정수형인지 실수형인지만 구분할 뿐만 아니라, 표현할 수 있는 범위가 다르다.
예를 들어 어떤 일련번호의 원래 데이터형은 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정리를 못해서 오늘 열심히 해봐야겠다