대용량 CSV 파일을 Parquet 파일로 변환 (fastparquet 엔진 사용)

이번 포스팅에서는 대용량 CSV 파일을 Parquet 파일로 변환 하는 Python 함수를 생성하는 방법에 대해서 알아보겠습니다.

개요

Python은 기본적으로 메모리 기반입니다. 분석에 필요한 모든 데이터들을 메모리에 적재하는 작업이 선행됩니다.
아무리 성능이 좋은 컴퓨터라 하더라도 메모리 용량은 매우 제한적입니다(특수 제작하는 경우 테라급의 메모리를 장착할 수 있지만, 비용이 만만치 않습니다.).

대용량의 CSV 파일을 일반적인 처리 방식(pd.read_csv(“디폴트 옵션”))으로 처리하면 100% 메모리 이슈가 발생하기 때문에, Python을 이용하여 빅데이터를 분석할 때는 메모리를 효율적으로 사용해야 합니다.

Python을 활용하여 빅데이터 분석을 할 때, 메모리를 효율적으로 사용하는 일반적인 방법은 CSV 파일을 Parquet 파일로 변환한 후, Parquet 파일에서 데이터 분석에 필요한 열을 추출하여 분석하는 것입니다(Parquet 파일에서 열 추출하는 방법이 궁금하시다면, parquet 파일의 열(column) 추출 방법 알아보기 포스팅 글을 참고하세요).

pandas의 chunksize 파라미터를 사용하면 메모리에 적재되는 데이터의 양을 제한할 수 있습니다. 이를 통해 파일을 작은 부분으로 나누어 순차적으로 읽고, 각 청크를 처리하여 최종적으로 하나의 Parquet 파일로 저장할 수 있습니다. 아래는 이 과정을 구현한 예제 코드입니다.

예제 데이터는 신용카드 사기 거래 탐지 데이터세트(출처: https://www.kaggle.com/mlg-ulb/creditcardfraud) 입니다.



CSV 파일을 Parquet 파일로 변환

import pandas as pd

# pip install fastparquet <- 만약 fastparquet 라이브러리가 설치되어 있지 않으면 실행 

# CSV 파일을 청크 단위로 읽기 
tempBigData = pd.read_csv("D:/creditcard.csv", chunksize = 100000)

for i, chunk in enumerate(tempBigData):

    # 첫 번째 청크를 새 Parquet 파일로 저장
    if i == 0 :     
        chunk.to_parquet("D:/creditcard.parquet", engine = 'fastparquet', index = False)

    # 그 다음 청크들을 기존 Parquet 파일에 추가        
    else:
        chunk.to_parquet("D:/creditcard.parquet", engine = 'fastparquet', index = False, append = True)

to_parquet 함수를 사용 시 engine 옵션을 ‘pyarrow’ 를 사용하면 에러가 발생하니, 사용 시 조심하셔야 합니다(‘pyarrow’와 ‘fastparquet’ 엔진 차이점에 대해서는 다음 포스팅에서 자세히 설명하고, 여기에서는 일단 생략하겠습니다.).


분석에 활용할 열(Column) 추출하기

그럼 위에서 생성된 parquet 파일에서 분석에 필요한 열을 추출해 보겠습니다.

tempBigDataSub = pd.read_parquet('D:/creditcard.parquet', columns = ['Amount', 'Class'])
fakeBigDataSub.head()
--------------------------------
	Amount	Class
0	5.49	0
1	0.99	0
2	13.60	0
3	0.00	0
4	344.94	0

추출이 잘되는 것을 확인하실 수 있습니다.

이상으로 CSV 파일을 Parquet 파일로 변환하는 방법에 대해서 알아보았습니다.
감사합니다.


답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다