Programming Blog

pandas 대용량 csv 파일 읽기 - dask 본문

빅데이터 분석/Pandas

pandas 대용량 csv 파일 읽기 - dask

Go-ong 2020. 11. 12. 11:53

포스팅 개요

pandas에서 4GB csv 파일을 읽었을 때 노트북이 다운되거나 메모리가 부족하다는 에러 메세지가 나왔다.

검색해 본 결과, Apache의 Pyarrow, Dask, pandas의 chunksize를 이용하는 방법이 나와있었다.


1GB csv파일을 test파일로 사용하여 경과 시간을 파악했다.

 

- pandas의 read_csv 사용했을 때 걸린 시간

import pandas as pd
import time
file_path = '파일위치.csv'

start_time = time.time() # 시작시간
pd_df = pd.read_csv(file_path, encoding='utf8')

print("time :", time.time() - start_time) # 현재시간 - 시작시간

pandas의 read_csv

 

 

- pyarrow의 read_csv 사용했을 때 걸린 시간

from pyarrow import csv
import time
file_path = '파일위치.csv'

start_time = time.time()  # 시작 시간 저장
pyarrow_df = csv.read_csv(file_path).to_pandas()

print("time :", time.time() - start_time) # 현재시간 - 시작시간

 

 

- dask의 read_csv 사용했을 때 걸린 시간

import dask.dataframe as dd
file_path = '파일위치.csv'

start_time = time.time()  # 시작 시간 저장
dask_df = dd.read_csv(file_path)

print("time :", time.time() - start_time) # 현재시간 - 시작시간

 

 

1GB의 csv파일을 불러오고나서 확인한 결과, Dask(0.01초) > Apache Pyarrow(23초) > pandas(42초) 의 결과가 나왔다.

Dask가 압도적으로 빠르게 파일을 읽는 것을 확인할 수 있다.

 

(번외) padnas의 chunksize 사용

chunksize = 10 ** 5
file_path = '파일위치.csv'

start = time.time()  # 시작 시간 저장

for cnt, chunk in enumerate(pd.read_csv(file_path, chunksize=chunksize)):
    indexs = chunk.index.values # index 파악하기 위한 변수
    print(len(indexs)) 
    print(indexs[:10], indexs[-10:]) # chunksize index의 시작에서10개 마지막 10개 index 출력
    
    if chunk is None: # 읽을 파일이 없으면 반복 종료
        break
        
print("time :", time.time() - start_time) # 현재시간 - 시작시간

번외로 pandas의 chunksize를 활영하여 csv파일도 읽어봤는데 사용자가 원하는 chunksize를 입력하여 파일 전체를 읽는 방식이라 걸린 시간이 전부 다르게 나와서 번외로 다루었다.


포스팅 결론

csv파일을 읽는 여러 방식이 있었지만 가장 빠른 것은 Dask!!

 

Comments