본문 바로가기

Life/Daily & Tips

[Tips]Pandas의 Dataframe 메모리 그리고 Column별 메모리 확인(python/MemoryError 오류 해결 방법)

SMALL

안녕하세요! 데코입니다!

오늘은 파이썬에서 많이 다루는 DataFrame에 대하여 간단한 팁을 포스팅하려고 합니다!

제가 22년에 P사의 프로젝트에서 다차원 분석을 진행할 때 제공된 메모리에 비해이용하는 데이터가 많고 데이터의 크기 또한 크다보니까 "MemoryError"를 많이 마주했어요!

 

Python에서 MemoryError 오류는 램(RAM) 메모리 부족해서 발생합니다.

 

그래서 저는 DataFrame을 생성하면 메모리를 확인하면서 작업을 했었어요!

 

1. DataFrame의 메모리 확인 방법

# 데이터에 대한 전체적인 정보를 알려줌(컬럼, NULL값 수, 메모리)
DF.info()

보통 DataFrame의 구조와 전반적인 내용을 확인할 때 "DF.info()"를 이용합니다.

조회한 결과는 아래와 같이 나와요!

 

DataFrame의 구조 확인

예시로 든 DataFrame은 153MB의 메모리를 차지하고 있네요!

 

작업 환경에서 할당된 메모리에 비해 특정 DataFrame이 많은 메모리를 차지하고 있다면,

DataFrame에서 분석에 활용할 컬럼만을 불러와서 활용하면 메모리를 줄일 수 있어요!

혹은 DataFrame를 N개의 DataFrame으로 나눠서 작업하는 방법도 존재합니다!

 

2. DataFrame의 컬럼별 메모리 확인 방법

# 컬럼별 메모리가 산출(단위 : byte)
DF.memory_usage()

memory_usage() 함수를 이용하면 DataFrame의 컬럼별 메모리 확인도 가능해요!

조회한 결과는 아래와 같이 나와요!

컬럼별 메모리 용량

예시에서 나온 SDT_YY, SDT_MM, SDY_DD 컬럼은 두자리의 정수로 구성되어 있기 때문에
기존에 자동으로 할당된 int64 대신 int8을 할당해도 모두 표현이 가능하고 메모리를 덜 차지합니다!

 

얼마나 차이가 나는지 아래 사진에 보여드릴게요!

(좌) 할당을 변경 전 컬럼별 메모리, (우) 할당을 변경 후 컬럼별 메모리

 

기존 INT64에서 INT8으로 할당을 변경한 컬럼 모두 메모리가 1/8 수준으로 감소한 것을 볼 수 있어요!

(13,375,232 Byte >> 1,671,904 Byte)

 

더 높은 RAM으로 교체하는 것도 방법중 하나 이지만,

이 방법은 현실적으로 불가능하니까

주어진 작업 환경에서 MemoryError 오류를 해결하는 방법을 적어보았습니다! :)


"MemoryError : "

해결 방법

  1. Info() 함수를 이용하여 DataFrame의 메모리를 확인하면서 작업한다.
    > 메모리가 너무 큰 경우 분석에 이용하는 컬러만을 추출하여 분석
    > 컬럼의 Dtype을 확인하고 데이터 특성에 맞는 Dtype을 직접 지정(float64 > float32)
  2. DataFrame을 N개의 DataFrame으로 분리하여 작업한다.
    ex)   DF_TOT을 3개의 DF으로 분리한다
            DF_TOT(60000 rows * 8 columns)
              = DF1(20000 rows * 8 columns) + DF2(20000 rows * 8 columns) + DF3(20000 rows * 8 columns)
  3. 높은 RAM으로 교체한다

 

 

다들 오류 없는 코딩 해보아요!

읽어주셔서 감사합니다! :)

LIST