python 데이터 분석의 DataFrame 메모리 최적화

💃오늘 사례 를 볼 때 pandas 데이터 에 관 한 메모리 압축 기능 을 보 았 습 니 다.특별히 기록 해 보 겠 습 니 다.
🎒먼저 상황 을 설명 하 겠 습 니 다.pandas 는 수백 메 가 의 dataframe 을 처리 하 는 데 문제 가 없습니다.그러나 우 리 는 몇 개의 G 심지어 더 큰 데 이 터 를 처리 할 때 특히 메모 리 를 차지 하고 메모리 가 작은 사용자 에 게 특히 좋 지 않 기 때문에 데 이 터 를 압축 하 는 것 이 필요 합 니 다.
1.pandas 데이터 점용 크기 보기
이렇게 자신의 메모리 크기 를 확인 하 는 것 을 보 여 드 리 겠 습 니 다(user로그 는 dataframe 의 이름)

#  1       dataframe     
user_log.info()
#  2   memory_usage()  getsizeof(user_log)
import time
import sys
print('all_data     : {:.2f} GB'.format(user_log.memory_usage().sum()/ (1024**3)))
print('all_data     : {:.2f} GB'.format(sys.getsizeof(user_log)/(1024**3)))

여기에 dataframe 파일 이 있 는데 user 라 고 합 니 다.log,원본 크기 가 1.91G 이 고 pandas 가 읽 어 내 며 메모리 가 2.9G 를 사 용 했 습 니 다.
원본 데이터 크기:1.91G
在这里插入图片描述
pandas 읽 기 후 메모리 소모:2.9G
在这里插入图片描述
2.데이터 압축
  • 수치 유형의 열 을 강등 처리('int 16','int 32','int 64','float 16','float 32','float 64')
  • 문자열 형식의 열 은 분류 유형(category)으로 바 뀌 었 습 니 다
  • 문자열 형식의 열 분류 수가 전체 줄 의 절반 을 초과 할 때 object 형식 을 사용 하 는 것 을 권장 합 니 다
  • 우 리 는 주로 수치 형 유형의 데 이 터 를 강등 시 킵 니 다.강등 이 무슨 뜻 인지 말씀 드 리 겠 습 니 다.하나의 서랍 에 비유 할 수 있 습 니 다.당신 은 큰 서랍 을 가지 고 있 지만 열쇠 만 담 으 면 많은 공간 을 낭비 할 수 있 습 니 다.만약 에 우리 가 열 쇠 를 작은 서랍 에 넣 으 면 많은 공간 을 절약 할 수 있 습 니 다.문자 의 형식 인 int 32 는 int8 보다 공간 을 많이 차지 하지만 우리 의 데 이 터 는 int8 형식 을 사용 하면 충분 합 니 다.이 로 인해 데이터 가 많은 공간 을 차지 하 게 되 었 습 니 다.우리 가 해 야 할 일 은 데이터 형식 전환 을 하고 메모리 공간 을 절약 하 는 것 입 니 다.
    압축 수치의 이 코드 는 천지 대회 의 한 종목 에서 본 것 으로 자 료 를 찾 아 본 결과 모두 압축 메모리 가 기본 적 으로 고정된 함수 형식 이라는 것 을 발견 했다.
    
    def reduce_mem_usage(df):
        starttime = time.time()
        numerics = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']
        start_mem = df.memory_usage().sum() / 1024**2
        for col in df.columns:
            col_type = df[col].dtypes
            if col_type in numerics:
                c_min = df[col].min()
                c_max = df[col].max()
                if pd.isnull(c_min) or pd.isnull(c_max):
                    continue
                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)
        end_mem = df.memory_usage().sum() / 1024**2
        print('-- Mem. usage decreased to {:5.2f} Mb ({:.1f}% reduction),time spend:{:2.2f} min'.format(end_mem,
                                                                                                               100*(start_mem-end_mem)/start_mem,
                                                                                                               (time.time()-starttime)/60))
        return df
    
    압축 방식 으로 데 이 터 를 user 가 져 오기log 2 중
    
    #     csv           csv
    user_log2=reduce_mem_usage(pd.read_csv(r'/Users/liucong/MainFiles/ML/tianchi/tianmiao/user_log_format1.csv'))
    
    읽 기 성공:내 훈 크기 가 890.48m 로 69.6%감소 하여 효과 가 현저 합 니 다.
    在这里插入图片描述
    압축 된 데이터 세트 정보 보기:형식 이 바 뀌 었 고 수량 이 줄 어 들 었 습 니 다.
    在这里插入图片描述
    3.참고 자료
    《천지 대 회》.
    《카 글 대 회》.
    링크:pandas 처리 datafarme 메모리 절약.
    python 데이터 분석 에 관 한 DataFrame 메모리 최적화 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 python DataFrame 메모리 최적화 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 지원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기