웹 광고 클릭률 예측 AI 경진대회

알고리즘 | 정형 | 시계열 | 분류 | 웹 로그 | AUC

  • moneyIcon Prize : 인증서 + 데이스쿨
  • 997명 마감

 

데이터 타입 변경을 통한 메모리 사용량 감소!

2024.05.12 17:10 675 Views

Pandas는 데이터프레임을 불러올 때 각 변수에 가장 메모리 사용량이 높은 데이터 타입을 부여합니다.

따라서, 변수의 범위에 맞게 데이터 타입을 변경하면 메모리 사용량을 줄일 수 있습니다. ex) int64 -> int8


아래 함수로 수치형 변수들의 데이터 타입을 변경할 수 있습니다.

저의 경우에는 메모리 사용량이 약 20% 감소했네요!


감사합니다.

def reduce_mem_usage(df):

    start_mem = df.memory_usage().sum() / 1024**2  # Memory usage before optimization
    print('Memory usage of dataframe is {:.2f} MB'.format(start_mem))

    for col in df.columns:
        col_type = df[col].dtype
        if str(col_type)=="category":
            continue

        # 수치형 데이터 최적화
        if col_type != object:
            c_min = df[col].min()
            c_max = df[col].max()
            if str(col_type)[:3] == 'int':
                if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max:
                    df[col] = df[col].astype(np.int8)
                elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max:
                    df[col] = df[col].astype(np.int16)
                elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max:
                    df[col] = df[col].astype(np.int32)
                elif c_min > np.iinfo(np.int64).min and c_max < np.iinfo(np.int64).max:
                    df[col] = df[col].astype(np.int64)
            else:
                if c_min > np.finfo(np.float16).min and c_max < np.finfo(np.float16).max:
                    df[col] = df[col].astype(np.float16)
                elif c_min > np.finfo(np.float32).min and c_max < np.finfo(np.float32).max:
                    df[col] = df[col].astype(np.float32)
                else:
                    df[col] = df[col].astype(np.float64)
        else:
            continue

    end_mem = df.memory_usage().sum() / 1024**2  # Memory usage after optimization
    print('Memory usage after optimization is: {:.2f} MB'.format(end_mem))
    print('Decreased by {:.1f}%'.format(100 * (start_mem - end_mem) / start_mem))

    return df