상세 컨텐츠

본문 제목

파이썬 엑셀 파일 빠르게 불러오는 방법(dask, csv, xlsx)

IT/Python

by Analyst Cho 2021. 5. 13. 23:47

본문

반응형

빅데이터를 분석한다거나, 파이썬으로 활용하는 과정에서 엑셀 파일을 데이터프레임 형식으로 가져와야 하는 일이 생긴다.

 

이때 엑셀 파일의 용량이 크거나, 파일의 수가 많을 경우 데이터를 가져오는데 시간이 꽤 많이 소요된다.

 

한번만 처리를 해야하면 기다릴 수도 있겠지만... 나의 경우는 일주일 간격으로 크롤링을 해서 데이터를 엑셀 파일로 만들어놓았고, 이용자가 접속할때마다 파일들을 확인하도록 프로그램을 설계해놨고 매번 이 데이터들을 통해 원하는 정보만 뽑아내도록 프로그램을 만들었다. 그렇기에 어떻게든 속도를 빠르게 해야만 했다. (혹여나 더 좋은 방법이 있다면 조언 부탁드립니다ㅎㅎ) 

 

이 과정에서 많은 엑셀 파일을 조회해야 했는데, 시도해본 방법을 포스팅 해보려 한다.

 

확장자에 따른 처리 속도와 dask를 사용해 '데이터를 불러올때도 병렬 처리를 통해 좀 더 빨라지지 않을까?' 생각하여 시도해보았다.

 

1. .xlsx 확장자 파일을 읽는다.

2. .csv 확장자 파일을 읽는다.

3. dask 모듈을 이용해 .xlsx 확장자 파일을 읽는다.

4. dask 모듈을 이용해 .csv 확장파 파일을 읽는다.

 

dask(다스크) 모듈은 파이썬에서 분산 병렬 컴퓨팅을 하기 위한 라이브러리다. 자체 작업 스케줄링 시스템이 있고 넘파이(NumPy), 판다스(pandas) 등 파이썬 데이터 프레임워크를 인식하며 단일 머신에서 다수의 머신으로 확장이 가능하다.

 

dask에 대해 더 알고 싶다면 홈페이지를 참고하길 바란다.(비슷한 것으론 '레이 Ray'가 있다고 한다.) https://dask.org/


먼저 os 모듈을 통해 엑셀 파일(데이터)가 있는 경로를 가져온다. 'os.getcwd()'

 

그 후 폴더 안에 있는 파일 목록을 'os.listdir()'을 통해 'file_list' 함수에 넣었다.

import os

path_dir = os.getcwd() + '\\excel_files\\'

---   ---   ---   ---

path_dir
'd:\\파일 경로\\excel_files\\'
file_list = os.listdir(path_dir)

---   ---   ---   ---

file_list
['2021.01.12.csv',
 '2021.01.12.xlsx',
 '2021.01.29.csv',
 '2021.01.29.xlsx',
 '2021.02.05.csv',
 '2021.02.05.xlsx',
 '2021.02.22.csv',
 '2021.02.22.xlsx',
 '2021.03.03.csv',
 '2021.03.03.xlsx',
 '2021.03.16.csv',
 '2021.03.16.xlsx',
 '2021.03.24.csv',
 '2021.03.24.xlsx',
 '2021.04.01.csv',
 '2021.04.01.xlsx',
 '2021.04.08.csv',
 '2021.04.08.xlsx',
 '2021.04.19.csv',
 '2021.04.19.xlsx',
 '2021.04.22.csv',
 '2021.04.22.xlsx',]

그 후 비교를 위해 '.csv' 와 '.xlsx' 파일을 확장자에 따라 분류하였다.

csv_list = [csv for csv in file_list if csv.endswith(".csv")]

csv_list
['2021.01.12.csv',
 '2021.01.29.csv',
 '2021.02.05.csv',
 '2021.02.22.csv',
 '2021.03.03.csv',
 '2021.03.16.csv',
 '2021.03.24.csv',
 '2021.04.01.csv',
 '2021.04.08.csv',
 '2021.04.19.csv',
 '2021.04.22.csv']
 
 ---   ---   ---   ---

excel_list = [excel for excel in file_list if excel.endswith(".xlsx")]

excel_list
['2021.01.12.xlsx',
 '2021.01.29.xlsx',
 '2021.02.05.xlsx',
 '2021.02.22.xlsx',
 '2021.03.03.xlsx',
 '2021.03.16.xlsx',
 '2021.03.24.xlsx',
 '2021.04.01.xlsx',
 '2021.04.08.xlsx',
 '2021.04.19.xlsx',
 '2021.04.22.xlsx']

1. 먼저 엑셀 확장자인 '.xlsx' 파일부터 시도했다. 시간이 6.63~7.11 정도로 소요되었다.

 

파일 하나당 2MB 정도 되는 것을 생각했을때 매우 느리다...ㅜㅜ

import time
import pandas as pd


for excel_name in excel_list:
    start = time.time() # 코드 시작 시간 저장
    print(path_dir + excel_name)

    testdf = pd.read_excel(path_dir + excel_name)
    print("time :", time.time() - start)  # 현재시각 - 시작시간 = 실행 시간
    
 ---   ---   ---   ---    
    
d:\파일경로\excel_files\2021.01.12.xlsx
time : 6.86955189704895
d:\파일경로\excel_files\2021.01.29.xlsx
time : 6.8885581493377686
d:\파일경로\excel_files\2021.02.05.xlsx
time : 6.914562463760376
d:\파일경로\excel_files\2021.02.22.xlsx
time : 6.635499000549316
d:\파일경로\excel_files\2021.03.03.xlsx
time : 6.867197751998901
d:\파일경로\excel_files\2021.03.16.xlsx
time : 7.048592805862427
d:\파일경로\excel_files\2021.03.24.xlsx
time : 6.948570013046265
d:\파일경로\excel_files\2021.04.01.xlsx
time : 7.012584686279297
d:\파일경로\excel_files\2021.04.08.xlsx
time : 7.022587537765503
d:\파일경로\excel_files\2021.04.19.xlsx
time : 7.113607406616211
d:\파일경로\excel_files\2021.04.22.xlsx
time : 7.025587797164917

2. .csv 확장자로 된 파일을 처리할땐, 0.074~0.085로 무려 100배나 처리가 빨라진 것을 알 수 있다.

for csv_name in csv_list:
    start = time.time() # 코드 시작 시간 저장
    print(path_dir + csv_name)

    testdf2 = pd.read_csv(path_dir + csv_name, encoding='CP949')
    print("time :", time.time() - start)  # 현재시각 - 시작시간 = 실행 시간
    
 ---   ---   ---   ---        
 
d:\파일경로\excel_files\2021.01.12.csv
time : 0.07701706886291504
d:\파일경로\excel_files\2021.01.29.csv
time : 0.0850210189819336
d:\파일경로\excel_files\2021.02.05.csv
time : 0.08301901817321777
d:\파일경로\excel_files\2021.02.22.csv
time : 0.07601714134216309
d:\파일경로\excel_files\2021.03.03.csv
time : 0.07701706886291504
d:\파일경로\excel_files\2021.03.16.csv
time : 0.07501745223999023
d:\파일경로\excel_files\2021.03.24.csv
time : 0.07701802253723145
d:\파일경로\excel_files\2021.04.01.csv
time : 0.07401680946350098
d:\파일경로\excel_files\2021.04.08.csv
time : 0.07501745223999023
d:\파일경로\excel_files\2021.04.19.csv
time : 0.08101820945739746
d:\파일경로\excel_files\2021.04.22.csv
time : 0.07601761817932129 

3. 이번에는 dask를 이용해서 '.xlsx' 확장자 파일을 처리해보겠다.

 

6.42~7.46으로 변동이 무의미한 처리 속도가 나왔다.

import pandas as pd
import dask
import dask.dataframe as dd
from dask.delayed import delayed


for excel_name in excel_list:
    start = time.time() # 코드 시작 시간 저장
    print(path_dir + excel_name)
    excel_file = path_dir + excel_name

    parts = dask.delayed(pd.read_excel)(excel_file, sheet_name=0)
    output_dataframe = dd.from_delayed(parts)

    print("time :", time.time() - start)  # 현재시각 - 시작시간 = 실행 시간

---   ---   ---   ---

d:\파일경로\excel_files\2021.01.12.xlsx
time : 7.465013027191162
d:\파일경로\excel_files\2021.01.29.xlsx
time : 6.861083030700684
d:\파일경로\excel_files\2021.02.05.xlsx
time : 6.94910740852356
d:\파일경로\excel_files\2021.02.22.xlsx
time : 6.426518440246582
d:\파일경로\excel_files\2021.03.03.xlsx
time : 7.012065649032593
d:\파일경로\excel_files\2021.03.16.xlsx
time : 7.017169237136841
d:\파일경로\excel_files\2021.03.24.xlsx
time : 7.040522813796997
d:\파일경로\excel_files\2021.04.01.xlsx
time : 7.152569770812988
d:\파일경로\excel_files\2021.04.08.xlsx
time : 7.092149972915649
d:\파일경로\excel_files\2021.04.19.xlsx
time : 6.9599103927612305
d:\파일경로\excel_files\2021.04.22.xlsx
time : 7.004428863525391

4. 이번에는 dask를 이용해서 '.csv' 확장자 파일을 처리해보겠다.

 

dask를 사용하지 않았을때 0.074~0.085 였던 것이 0.017~0.019으로 4배가량 더 빠르게 처리된 것을 알 수 있다.

import time
import dask.dataframe as dd


for csv_name in csv_list:
    start = time.time() # 코드 시작 시간 저장
    print(path_dir + csv_name)

    testdf = dd.read_csv(path_dir + csv_name, encoding='CP949')
    print("time :", time.time() - start)  # 현재시각 - 시작시간 = 실행 시간
    
---   ---   ---   ---

d:\파일경로\excel_files\2021.01.12.csv
time : 0.019544601440429688
d:\파일경로\excel_files\2021.01.29.csv
time : 0.018564224243164062
d:\파일경로\excel_files\2021.02.05.csv
time : 0.019542694091796875
d:\파일경로\excel_files\2021.02.22.csv
time : 0.019544124603271484
d:\파일경로\excel_files\2021.03.03.csv
time : 0.018566608428955078
d:\파일경로\excel_files\2021.03.16.csv
time : 0.019541501998901367
d:\파일경로\excel_files\2021.03.24.csv
time : 0.01856541633605957
d:\파일경로\excel_files\2021.04.05.csv
time : 0.018565654754638672
d:\파일경로\excel_files\2021.04.08.csv
time : 0.018566608428955078
d:\파일경로\excel_files\2021.04.19.csv
time : 0.017589092254638672
d:\파일경로\excel_files\2021.04.22.csv
time : 0.019542217254638672
d:\파일경로\excel_files\2021.04.28.csv
time : 0.01856684684753418
d:\파일경로\excel_files\2021.05.11.csv
time : 0.021496057510375977

결론은 '.xlsx' 확장자 보다는 '.csv'를 사용하는 것이 처리 속도 향상에 도움이 된다는 점이다.

 

대용량 데이터를 처리하게 된다면 병렬처리를 할 수 있는 dask를 쓴다면 금상첨화가 될 것이다.

반응형

관련글 더보기

댓글 영역