Project

Python / DASK(1)

0. DASK ?

- Dask는 가상의 데이터프레임. 병렬처리를 활용해 메모리를 효율적으로 사용할 수 있다. 왜 가상이냐면, 하드디스크에 있는 내용을 RAM에 올리는 것이 아니라 하드디스크 내의 데이터를 링크하는 것이기 때문이다. 

- 즉, DASK를 통해 메모리상에 전부 올릴 수 없는 대규모 파일을 활용가능. 

- Numpy나 scikit learn에서도 활용할 수 있도록 만들어졌는데, 일단 이번 프로젝트에서는 Pandas 로 사용하였다. 

- CPU 코어 수만큼 병렬 처리가 가능하다. m1이 깡패가 될 수 있는 지점이다. 

 

(제주도 관광객의 대중교통 이용과 관련하여 프로젝트를 진행하려는데 원본 파일이 무려 16기가에 달해 울면서 도입하였다.  

귀여운 8기가램 구형 노트북도 16기가짜리 파일을 올릴 수 있게 만들어주는 매직... )

다시보니 파일 하나가 16기가였구나 그렇구나

그나마의 단점이라면 메모리가 아니라 하드디스크에 링크된 걸 사용하는 거라 느리다는 건데 따지고 보면 램 용량으로 처리가 불가능한 파일을 처리할 수 있게 해주는 셈이니 그런 게 대수겠는가. 

 

1. 기본 사용법

1) 설치 

#설치
conda install dask
#혹은 
pip install dask

#dask dataframe은 이렇게 불러온다
import dask.dataframe as dd 

 

2) 읽기 / 쓰기

사실 Pandas와 문법이 비슷하다. 쓰다보면 또 다른데 어찌보면 비슷하고... 뭐 그런 정도

DASK 공식 사이트에 가보면 개발진들도 그점을 장점으로 내세우고 있다("familiar user interface"). 동의한다.

#읽어오기
example = dd.read_csv("example.csv")

 문제(?)는 저장할 때 발생한다. 

example.to_csv("datas/example/data_*.csv", index=False)

실습했던 파일 중에서 발췌하였다 / 강의 : 패스트캠퍼스 DSS 17

다스크는 전체 파일을 조각조각(Partition)내서 처리한다. 그래서 저장할 때도 파일들이 조각조각난 채로 저장된다. 번호는 0번부터 알아서 붙는데 16기가 짜리를 감히 저장해봤을 땐 저장된 파일 수가 백개가 넘어갔던 것 같다. 

물론 얼마든지 다시 하나의 데이터프레임으로 불러올 수 있기 때문에 걱정할 필요는 없다. 

다만 한 파일로 저장하고 싶다면... 결국 Pandas를 거쳐 저장해야하기 때문에 메모리 문제가 발생할 수 있다.

#불러오기
example = dd.read_csv("datas/example/data_*.csv")

 

3) Pandas처럼 함수쓰기 

다스크는 보여주는 방식이 좀 다르다. 이게 나같은 뉴비에게는 다스크 사용의 진입장벽이라고 생각한다. 

 

다스크에서 연산을 수행할 때에는 .compute()를 붙인다. compute()를 해주지 않으면 다스크는 응! 나 시킨대로 처리했어! 하고 아무것도 보여주지 않을 것이다. 시킨 거 다했냐고 물어보면 당당하게 다했다고 대답하는데 그럼 가져와보라고 하면 오래 걸리는 구몬학생처럼...?

#compute로 실행해야 값을 확인할 수 있다
dd.count().compute()

#그냥 compute만 해주면 판다스의 데이터프레임을 반환한다
dd.compute() # -> pd.DataFrame

 

2. 설정

- 파일이 클수록 얼마나 걸릴지 몰라서 막막하다. 프로그레스 바를 활성화해두면 진척도를 육안으로 확인가능하다

- 그럼 아래 예시처럼 진행도가 표시된다. 

from dask.diagnostics import ProgressBar
ProgressBar().register()

이렇게 돌려놓고 쉬다 오는거지

- 그리고 다음과 같이 작업할 cpu 코어의 수를 지정해줄 수 있다. 물론 내 pc의 코어가 따라주는 한에서만 가능하다. 

# 일해라 코어들아
dd.count().compute(scheduler='processes', num_workers=4)

 

이상으로 간단히 다스크에서 파일 읽고 저장하는 법, 연산하는 법, 그리고 설정법 등을 적어보았다. 

 


내용이 적어서 민망한데 그렇다고 막상 다스크 사용법을 하나하나 쓰자니 방대하다. 사실 다스크는 기댈 메모리가 없는 채로 대용량 파일을 마주해야 하는 상황이 와야 비로소 터득하게 되는 것 같다. 나도 내 램을 넘어서는 버스 이용 데이터를 맞닥뜨려서야 제대로 활용해볼 생각을 했으니깐.

아무튼 다음 글에서는 이번 프로젝트에서 다스크를 어떻게 썼었는지를 몇가지 사례로 소개해보고자 한다.