Python 병렬 처리를 위한 Dask

@winuss · November 01, 2020 · 19 min read

큰 데이터를 처리하기 위해서는 병렬처리가 효율적인데, 그래서 Apache Spark의 pyspark를 많이들 사용한다. 속도는 매우 빠르지만 Pandas에 익숙한 사람들은 불편한 점이 있다. 이를 해소시켜 줄만한 라이브러리가 바로 Dask이다. (그 외 modin, ray, vaex등이 있는듯 하니 관심있다면 찾아보자.)

병렬 컴퓨팅(Parallel Computing)이란?

여러 단계 별로 구성된 작업을 수행할 때 각 단계에서 이전 작업이 완료되기를 기다리지 않고 이들이 동시에 처리되도록 하는 것이다.

따라서 난이도는 각 작업의 특징에 따라 달라지는데, 각 작업의 시작과 끝을 제외하고 각 단계가 서로 독립적으로 수행되는 작업은 병렬화가 쉽고, 각 단계 사이의 많은 데이터가 전송되고 교환되어야 하는 작업은 병렬화가 어렵다.

Dask 란?

Dask는 Python 라이브러리로 기능면에서는 Apache Spark와 비슷하지만 numpy, pandas와 긴밀하게 연결되어 있어서 python 사용자들이 Spark보다 훨씬 쉽게 배우고 활용할 수 있고, 다임과 같은 두 가지 기능을 가진다.

  1. 가상 데이터프레임
  2. 병렬처리용 작업 스케줄러

가상 데이터프레임

가상 데이터프레임은 Pandas 데이터프레임과 비슷한 기능을 제공하지만 실제로 모든 데이터가 메모리 상에 로드되어 있는 것이 아니라 하나 이상의 파일 혹인 데이터베이스에 존재하는 채로 처리할 수 있는 기능이다. 따라서 메모리 크기와 관계 없이 엄청나게 큰 CSV 파일을 가상 데이터프레임으로 로드하거나 같은 형식의 데이터를 가진 여러개의 CSV 파일을 하나의 가상 데이터프레임에 로드할 수 있다.

실제로 Dask의 가상 데이터프레임을 어떻게 쓸 수 있는지 알아보기 위해 간단한 CSV 파일을 만들어 살펴보자.

%%writefile data1.csv
time,temperature,humidity
0,22,58
1,21,57
2,25,57
3,26,55
4,22,53
5,23,59
Writing data1.csv

Dask 패키지가 설치 되어 있지 않다면 설치를 하고 해당 패키지를 임포트하자.

Install

  • conda install dask (anaconda environment)
  • pip install "dask[complete]" (pip based installation)
import dask.dataframe as dd
df = dd.read_csv("data1.csv")
df
Dask DataFrame Structure:
time temperature humidity
npartitions=1
int64 int64 int64
... ... ...
Dask Name: read-csv, 1 tasks

사용법을 보면 기존에 Pandas 데이터프레임과 유사하지만 실제 결과를 보면 아직 데이터를 메모리에 읽지 않았기 때문에 값은 표시되지 않는다.

값을 실제로 표시하려면 head, tail 명령을 내리면 해당 데이터를 읽어서 표시한다.

df.head()
time temperature humidity
0 0 22 58
1 1 21 57
2 2 25 57
3 3 26 55
4 4 22 53
df.temperature.mean()
dd.Scalar<series-..., dtype=float64>

위의 경우 temperature 열의 평균을 구하기 위해 명령 입력하였지만 결과가 나오지 않는다. 그 이유는 mean는 연산 반환값의 결과가 아닌 작업(task)이기 때문이다. 구체적으로 어떤 작업인지를 보려면 visualize 매서드를 사용하여 작업 그래프(graph)를 볼 수 있다. 작업 그래프란 이 계산을 하기 위해 실제로 CPU가 해야할 일들의 순서도라고 생각하면 된다.

이 작업의 값을 실제로 구하려면 결과로 받은 작업 객체의 compute 매서드를 호출해야 한다.

df.temperature.mean().compute()
23.166666666666668

이번에는 이 값을 화씨로 변환해 보자

(df.temperature * 9 / 5 + 32).compute()
0    71.6
1    69.8
2    77.0
3    78.8
4    71.6
5    73.4
Name: temperature, dtype: float64

이번에는 이 값으로 원래의 temperature 열을 갱신해보자. 이 때는 Pandas의 문법을 쓰지 못하고 다음과 같이 assign 메서드를 사용해야 한다. assign 메서드를 사용할 때는 compute를 할 필요가 없다.

df = df.assign(temperature=df.temperature * 9 / 5 + 32)
df.head()
time temperature humidity
0 0 71.6 58
1 1 69.8 57
2 2 77.0 57
3 3 78.8 55
4 4 71.6 53

자료형을 변환하거나 새로운 열을 추가하는 것도 가능하다.

df = df.assign(title=df.temperature.astype(str) + " degree")
df.head()
time temperature humidity title
0 0 71.6 58 71.6 degree
1 1 69.8 57 69.8 degree
2 2 77.0 57 77.0 degree
3 3 78.8 55 78.8 degree
4 4 71.6 53 71.6 degree

Apache Spark를 사용해본 사람이라면 Transformation과 Action의 개념과 유사하다는 것을 눈치 챘을것이다!

복수 데이터에 대한 가상 데이터프레임

Dask는 가상 데이터프레임으로 원천 데이터 파일을 하나가 아닌 복수로 설정할 수도 있다. 예를 들어 앞서 보았던 data1.dsv 파일 이외에도 다음과 같이 data2.csv, data3.csv 파일이 있을 경우, 이 파일을 한 번에 하나의 데이터프레임으로 읽어들일 수도 있다.

%%writefile data2.csv
time,temperature,humidity
0,22,58
1,21,57
2,25,57
3,26,55
4,22,53
5,23,59
Writing data2.csv
%%writefile data3.csv
time,temperature,humidity
0,22,58
1,21,57
2,25,57
3,26,55
4,22,53
5,23,59
Writing data3.csv

복수 파일은 와일드카드(*) 기호를 이용하여 읽는다.

df = dd.read_csv('data*.csv')
df.count().compute()
time           18
temperature    18
humidity       18
dtype: int64
df.temperature.describe().compute()
count    18.000000
mean     23.166667
std       1.823055
min      21.000000
25%      22.000000
50%      22.500000
75%      24.500000
max      26.000000
Name: temperature, dtype: float64

대량 데이터의 병렬 처리

자 이제 Dask로 대량의 데이터를 처리해보자. 샘플로 쓸 데이터는 미국 정부가 발표하는 공개 정보 중 하나로 시카고의 범죄 관련 데이터이다.

다음 명령으로 이 데이터를 다운로드 받을 수 있다. CSV 파일의 크기가 1.3GB가 넘으므로 다운로드에 10분 이상 걸릴수 있다.

(만약 윈도우라면 wget을 사용하기 위해 https://eternallybored.org/misc/wget/ 여기에서 wget 최신 버전을 받고 c:\windows\system32에 위치시키면 된다.)

!wget -O crime.csv https://data.cityofchicago.org/api/views/ijzp-q8t2/rows.csv?accessType=DOWNLOAD
...... .......... .......... ..........  291K
1218900K .......... .......... .......... .......... .......... 11.7M
1218950K .......... .......... .......... .......... .......... 9.51M
1219000K .......... .......... .......... .......... .......... 14.1M
1219050K .......... .......... .......... .......... .......... 12.5M
1219100K .......... .......... .......... .......... .......... 10.1M
1219150K .......... .......... .......... .......... ..........  292K
1219200K .......... .......... .......... .......... .......... 9.68M
1219250K .......... .......... .......... .......... .......... 11.6M
1219300K .......... .......... .......... .......... .......... 12.1M
1219350K .......... .......... .......... .......... .......... 11.0M
1219400K .......... .......... .......... .......... .......... 10.7M
1219450K .......... .......... .......... .......... ..........  293K
1219500K .......... .......... .......... .......... .......... 11.5M
1219550K .......... .......... .......... .......... .......... 11.2M
1219600K .......... .......... .......... .......... .......... 9.82M
1219650K .......... .......... .......... .......... .......... 11.7M
1219700K .......... .......... .......... .......... .......... 11.9M
1219750K .......... .......... .......... .......... ..........  238K
1219800K .......... .......... .......... .......... .......... 11.3M
1219850K .......... .......... .......... .......... .......... 11.7M
1219900K .......... .......... .......... .......... .......... 12.0M
1219950K .......... .......... .......... .......... .......... 11.7M
1220000K .......... .......... .......... .......... .......... 9.24M
1220050K .......... .......... .......... .......... ..........  293K
1220100K .......... .......... .......... .......... .......... 11.9M
1220150K .......... .......... .......... .......... .......... 12.2M
1220200K .......... .......... .......... .......... .......... 11.2M
1220250K .......... .......... .......... .......... .......... 11.3M
1220300K .......... .......... .......... .......... .......... 12.1M
1220350K .......... .......... .......... .......... ..........  292K
1220400K .......... .......... .......... .......... .......... 11.8M
1220450K .......... .......... .......... .......... .......... 11.6M
1220500K .......... .......... .......... .......... .......... 9.90M
1220550K .......... .......... .......... .......... .......... 8.73M
1220600K .......... .......... .......... .......... .......... 12.4M
1220650K .......... .......... .......... .......... .......... 3.45M
1220700K .......... .......... .......... .......... ..........  315K
1220750K .......... .......... .......... .......... .......... 12.7M
1220800K .......... .......... .......... .......... .......... 9.12M
1220850K .......... .......... .......... .......... .......... 9.26M
1220900K .......... .......... .......... .......... .......... 11.2M
1220950K .......... .......... .......... .......... .......... 12.1M
1221000K .......... .......... .......... .......... ..........  296K
1221050K .......... .......... .......... .......... .......... 13.0M
1221100K .......... .......... .......... .......... .......... 12.3M
1221150K .......... .......... .......... .......... .......... 10.1M
1221200K .......... .......... .......... .......... .......... 8.55M
1221250K .......... .......... .......... .......... .......... 11.6M
1221300K .......... .......... .......... .......... ..........  249K
1221350K .......... .......... .......... .......... .......... 12.1M
1221400K .......... .......... .......... .......... .......... 10.8M
1221450K .......... .......... .......... .......... .......... 10.7M
1221500K .......... .......... .......... .......... .......... 13.7M
1221550K .......... .......... .......... .......... .......... 11.8M
1221600K .......... .......... .......... .......... ..........  665K
1221650K .......... .......... .......... .......... ..........  502K
1221700K .......... .......... .......... .......... .......... 12.0M
1221750K .......... .......... .......... .......... .......... 9.97M
1221800K .......... .......... .......... .......... .......... 13.0M
1221850K .......... .......... .......... .......... .......... 11.0M
1221900K .......... .......... .......... .......... .......... 12.7M
1221950K .......... .......... .......... .......... ..........  293K
1222000K .......... .......... .......... .......... .......... 12.0M
1222050K .......... .......... .......... .......... .......... 11.6M
1222100K .......... .......... .......... .......... .......... 11.7M
1222150K .......... .......... .......... .......... .......... 12.0M
1222200K .......... .......... .......... .......... .......... 11.1M
1222250K .......... .......... .......... .......... .......... 1.50M
1222300K .......... .......... .......... .......... ..........  355K
1222350K .......... .......... .......... .......... .......... 10.3M
1222400K .......... .......... .......... .......... .......... 8.38M
1222450K .......... .......... .......... .......... .......... 11.3M
1222500K .......... .......... .......... .......... .......... 12.0M
1222550K .......... .......... .......... .......... .......... 10.6M
1222600K .......... .......... .......... .......... ..........  297K
1222650K .......... .......... .......... .......... .......... 14.1M
1222700K .......... .......... .......... .......... .......... 9.30M
1222750K .......... .......... .......... .......... .......... 11.5M
1222800K .......... .......... .......... .......... .......... 9.04M
1222850K .......... .......... .......... .......... .......... 11.0M
1222900K .......... .......... .......... .......... ..........  685K
1222950K .......... .......... .......... .......... ..........  376K
1223000K .......... .......... .......... .......... .......... 10.8M
1223050K .......... .......... .......... .......... .......... 11.9M
1223100K .......... .......... .......... .......... .......... 11.5M
1223150K .......... .......... .......... .......... .......... 12.4M
1223200K .......... .......... .......... .......... .......... 9.14M
1223250K .......... .......... .......... .......... ..........  296K
1223300K .......... .......... .......... .......... .......... 11.7M
1223350K .......... .......... .......... .......... .......... 12.1M
1223400K .......... .......... .......... .......... .......... 10.1M
1223450K .......... .......... .......... .......... .......... 13.1M
1223500K .......... .......... .......... .......... .......... 11.4M
1223550K .......... .......... .......... .......... .......... 12.3M
1223600K .......... .......... .......... .......... ..........  294K
1223650K .......... .......... .......... .......... .......... 12.2M
1223700K .......... .......... .......... .......... .......... 11.6M
1223750K .......... .......... .......... .......... .......... 11.6M
1223800K .......... .......... .......... .......... .......... 10.2M
1223850K .......... .......... .......... .......... .......... 12.9M
1223900K .......... .......... .......... .......... ..........  294K
1223950K .......... .......... .......... .......... .......... 16.0M
1224000K .......... .......... .......... .......... .......... 9.55M
1224050K .......... .......... .......... .......... .......... 11.6M
1224100K .......... .......... .......... .......... .......... 11.2M
1224150K .......... .......... .......... .......... .......... 11.9M
1224200K .......... .......... .......... .......... .......... 1.24M
1224250K .......... .......... .......... .......... ..........  372K
1224300K .......... .......... .......... .......... .......... 13.5M
1224350K .......... .......... .......... .......... .......... 12.1M
1224400K .......... .......... .......... .......... .......... 8.88M
1224450K .......... .......... .......... .......... .......... 11.2M
1224500K .......... .......... .......... .......... .......... 11.7M
1224550K .......... .......... .......... .......... ..........  244K
1224600K .......... .......... .......... .......... .......... 11.3M
1224650K .......... .......... .......... .......... .......... 10.3M
1224700K .......... .......... .......... .......... .......... 13.8M
1224750K .......... .......... .......... .......... .......... 12.3M
1224800K .......... .......... .......... .......... .......... 9.29M
1224850K .......... .......... .......... .......... .......... 11.6M
1224900K .......... .......... .......... .......... ..........  296K
1224950K .......... .......... .......... .......... .......... 7.57M
1225000K .......... .......... .......... .......... .......... 11.0M
1225050K .......... .......... .......... .......... .......... 14.8M
1225100K .......... .......... .......... .......... .......... 11.1M
1225150K .......... .......... .......... .......... .......... 12.4M
1225200K .......... .......... .......... .......... ..........  297K
1225250K .......... .......... .......... .......... .......... 11.7M
1225300K .......... .......... .......... .......... .......... 8.52M
1225350K .......... .......... .......... .......... .......... 11.6M
1225400K .......... .......... .......... .......... .......... 11.4M
1225450K .......... .......... .......... .......... .......... 8.07M
1225500K .......... .......... .......... .......... .......... 11.7M
1225550K .......... .......... .......... .......... ..........  301K
1225600K .......... .......... .......... .......... .......... 7.09M
1225650K .......... .......... .......... .......... .......... 14.4M
1225700K .......... .......... .......... .......... .......... 9.71M
1225750K .......... .......... .......... .......... .......... 9.20M
1225800K .......... .......... .......... .......... .......... 11.6M
1225850K .......... .......... .......... .......... ..........  302K
1225900K .......... .......... .......... .......... .......... 10.3M
1225950K .......... .......... .......... .......... .......... 9.68M
1226000K .......... .......... .......... .......... .......... 9.45M
1226050K .......... .......... .......... .......... .......... 11.7M
1226100K .......... .......... .......... .......... .......... 8.02M
1226150K .......... .......... .......... .......... .......... 11.8M
1226200K .......... .......... .......... .......... ..........  247K
1226250K .......... .......... .......... .......... .......... 12.0M
1226300K .......... .......... .......... .......... .......... 11.7M
1226350K .......... .......... .......... .......... .......... 11.3M
1226400K .......... .......... .......... .......... .......... 9.61M
1226450K .......... .......... .......... .......... .......... 12.1M
1226500K .......... .......... .......... .......... ..........  295K
1226550K .......... .......... .......... .......... .......... 13.4M
1226600K .......... .......... .......... .......... .......... 10.9M
1226650K .......... .......... .......... .......... .......... 12.1M
1226700K .......... .......... .......... .......... .......... 9.85M
1226750K .......... .......... .......... .......... .......... 14.1M
1226800K .......... .......... .......... .......... .......... 2.31M
1226850K .......... .......... .......... .......... ..........  327K
1226900K .......... .......... .......... .......... .......... 11.7M
1226950K .......... .......... .......... .......... .......... 11.4M
1227000K .......... .......... .......... .......... .......... 11.1M
1227050K .......... .......... .......... .......... .......... 9.91M
1227100K .......... .......... .......... .......... .......... 13.9M
1227150K .......... .......... .......... .......... ..........  296K
1227200K .......... .......... .......... .......... .......... 8.93M
1227250K .......... .......... .......... .......... .......... 12.0M
1227300K .......... .......... .......... .......... .......... 11.2M
1227350K .......... .......... .......... .......... .......... 12.1M
1227400K .......... .......... .......... .......... .......... 11.2M
1227450K .......... .......... .......... .......... .......... 9.48M
1227500K .......... .......... .......... .......... ..........  299K
1227550K .......... .......... .......... .......... .......... 10.4M
1227600K .......... .......... .......... .......... .......... 9.38M
1227650K .......... .......... .......... .......... .......... 12.0M
1227700K .......... .......... .......... .......... .......... 11.5M
1227750K .......... .......... .......... .......... .......... 9.85M
1227800K .......... .......... .......... .......... ..........  247K
1227850K .......... .......... .......... .......... .......... 13.2M
1227900K .......... .......... .......... .......... ..........  532K
1227950K .......... .......... .......... .......... .......... 15.7M
1228000K .......... .......... .......... .......... .......... 19.8M
1228050K .......... .......... .......... .......... .......... 23.8M
1228100K .......... .......... .......... .......... .......... 33.4M
1228150K .......... .......... .......... .......... ..........  571K
1228200K .......... .......... .......... .......... .......... 11.0M
1228250K .......... .......... .......... .......... .......... 10.5M
1228300K .......... .......... .......... .......... .......... 12.0M
1228350K .......... .......... .......... .......... .......... 11.1M
1228400K .......... .......... .......... .......... .......... 10.6M
1228450K .......... .......... .......... .......... .......... 1.27M
1228500K .......... .......... .......... .......... ..........  374K
1228550K .......... .......... .......... .......... .......... 11.0M
1228600K .......... .......... .......... .......... .......... 11.2M
1228650K .......... .......... .......... .......... .......... 12.3M
1228700K .......... .......... .......... .......... .......... 11.6M
1228750K .......... .......... .......... .......... .......... 11.6M
1228800K .......... .......... .......... .......... ..........  295K
1228850K .......... .......... .......... .......... .......... 11.6M
1228900K .......... .......... .......... .......... .......... 11.9M
1228950K .......... .......... .......... .......... .......... 9.56M
1229000K .......... .......... .......... .......... .......... 10.9M
1229050K .......... .......... .......... .......... .......... 14.5M
1229100K .......... .......... .......... .......... .......... 12.2M
1229150K .......... .......... .......... .......... ..........  296K
1229200K .......... .......... .......... .......... .......... 11.8M
1229250K .......... .......... .......... .......... .......... 11.2M
1229300K .......... .......... .......... .......... .......... 12.0M
1229350K .......... .......... .......... .......... .......... 10.5M
1229400K .......... .......... .......... .......... .......... 12.1M
1229450K .......... .......... .......... .......... .......... 11.9M
1229500K .......... .......... .......... .......... ..........  245K
1229550K .......... .......... .......... .......... .......... 10.8M
1229600K .......... .......... .......... .......... .......... 11.7M
1229650K .......... .......... .......... .......... .......... 11.6M
1229700K .......... .......... .......... .......... .......... 12.0M
1229750K .......... .......... .......... .......... .......... 11.0M
1229800K .......... .......... .......... .......... ..........  297K
1229850K .......... .......... .......... .......... .......... 13.2M
1229900K .......... .......... .......... .......... .......... 11.9M
1229950K .......... .......... .......... .......... .......... 8.50M
1230000K .......... .......... .......... .......... .......... 13.2M
1230050K .......... .......... .......... .......... .......... 11.5M
1230100K .......... .......... .......... .......... .......... 12.3M
1230150K .......... .......... .......... .......... ..........  296K
1230200K .......... .......... .......... .......... .......... 14.5M
1230250K .......... .......... .......... .......... .......... 11.9M
1230300K .......... .......... .......... .......... .......... 10.7M
1230350K .......... .......... .......... .......... .......... 10.3M
1230400K .......... .......... .......... .......... .......... 11.6M
1230450K .......... .......... .......... .......... .......... 11.4M
1230500K .......... .......... .......... .......... ..........  299K
1230550K .......... .......... .......... .......... .......... 11.4M
1230600K .......... .......... .......... .......... .......... 11.9M
1230650K .......... .......... .......... .......... .......... 8.88M
1230700K .......... .......... .......... .......... .......... 17.3M
1230750K .......... .......... .......... .......... .......... 9.29M
1230800K .......... .......... .......... .......... .......... 11.7M
1230850K .......... .......... .......... .......... ..........  298K
1230900K .......... .......... .......... .......... .......... 13.7M
1230950K .......... .......... .......... .......... .......... 8.85M
1231000K .......... .......... .......... .......... .......... 12.1M
1231050K .......... .......... .......... .......... .......... 15.8M
1231100K .......... .......... .......... .......... .......... 10.8M
1231150K .......... .......... .......... .......... .......... 9.94M
1231200K .......... .......... .......... .......... ..........  247K
1231250K .......... .......... .......... .......... .......... 11.8M
1231300K .......... .......... .......... .......... .......... 9.64M
1231350K .......... .......... .......... .......... .......... 13.5M
1231400K .......... .......... .......... .......... .......... 12.5M
1231450K .......... .......... .......... .......... .......... 11.5M
1231500K .......... .......... .......... .......... .......... 11.7M
1231550K .......... .......... .......... .......... ..........  139K
1231600K .......... .......... .......... .......... .......... 17.9M
1231650K .......... .......... .......... .......... .......... 28.4M
1231700K .......... .......... .......... .......... .......... 21.4M
1231750K .......... .......... .......... .......... .......... 21.0M
1231800K .......... .......... .......... .......... .......... 14.8M
1231850K .......... .......... .......... .......... .......... 22.9M
1231900K .......... .......... .......... .......... .......... 27.3M
1231950K .......... .......... .......... .......... .......... 26.0M
1232000K .......... .......... .......... .......... .......... 20.2M
1232050K .......... .......... .......... .......... .......... 21.5M
1232100K .......... .......... .......... .......... .......... 24.6M
1232150K .......... .......... .......... .......... ..........  297K
1232200K .......... .......... .......... .......... .......... 8.90M
1232250K .......... .......... .......... .......... .......... 7.73M
1232300K .......... .......... .......... .......... .......... 9.98M
1232350K .......... .......... .......... .......... .......... 6.42M
1232400K .......... .......... .......... .......... ..........  298K
1232450K .......... .......... .......... .......... .......... 9.66M
1232500K .......... .......... .......... .......... .......... 8.40M
1232550K .......... .......... .......... .......... .......... 7.90M
1232600K .......... .......... .......... .......... .......... 9.12M
1232650K .......... .......... .......... .......... .......... 7.96M
1232700K .......... .......... .......... .......... ..........  248K
1232750K .......... .......... .......... .......... .......... 9.37M
1232800K .......... .......... .......... .......... .......... 12.2M
1232850K .......... .......... .......... .......... .......... 11.7M
1232900K .......... .......... .......... .......... .......... 11.8M
1232950K .......... .......... .......... .......... ..........  668K
1233000K .......... .......... .......... .......... ..........  486K
1233050K .......... .......... ..                               15.4M=13m22s

2020-11-10 11:06:21 (1.50 MB/s) - 'crime.csv' saved [1262665799]

파일을 다운로드 받은 후에는 가상 데이터프레임으로 읽어들인다. 구체적인 데이터를 아직 모르기 때문에 우선 문자열 자료형으로 읽어들인다. 또 error_bad_lines 옵션을 False로 해서 오류가 나는 데이터는 생략하도록 한다.

df = dd.read_csv("crime.csv", dtype=str, error_bad_lines=False, warn_bad_lines=False)
df
Dask DataFrame Structure:
ID Case Number Date Block IUCR Primary Type Description Location Description Arrest Domestic Beat District Ward Community Area FBI Code X Coordinate Y Coordinate Year Updated On Latitude Longitude Location
npartitions=20
object object object object object object object object object object object object object object object object object object object object object object
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
Dask Name: read-csv, 20 tasks
df.tail()
ID Case Number Date Block IUCR Primary Type Description Location Description Arrest Domestic ... Ward Community Area FBI Code X Coordinate Y Coordinate Year Updated On Latitude Longitude Location
196819 7026076 HR432572 07/15/2009 04:00:00 PM 007XX E 79TH ST 0620 BURGLARY UNLAWFUL ENTRY APARTMENT false false ... 6 44 05 1182734 1852793 2009 02/28/{ NaN NaN NaN
196820 "error" : true NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
196821 "message" : "Internal error" NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
196822 "status" : 500 NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
196823 } NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

5 rows × 22 columns

이제 이 데이터프레임으로 분석을 시작해보자. 데이터 크기가 큰 만큼 시간이 오래 걸리기 때문에 친절하게도 Dask는 작업 진행도를 알 수 있는 ProgressBar라는 것을 제공한다. 다음과 같이 ProgressBar를 만들고 등록한다.

from dask.diagnostics import ProgressBar 

pbar = ProgressBar()
pbar.register()

일단 등록하면 작업의 진행도를 프로그레스바 형태로 알려준다. 우선 각 열의 데이터 개수를 세어보자.

%%time
df.count().compute()
[########################################] | 100% Completed | 21.9s
Wall time: 21.9 s





ID                      5366005
Case Number             5365999
Date                    5366001
Block                   5366001
IUCR                    5366001
Primary Type            5366001
Description             5366001
Location Description    5359222
Arrest                  5366001
Domestic                5366001
Beat                    5366001
District                5365954
Ward                    4751265
Community Area          4753051
FBI Code                5366001
X Coordinate            5285054
Y Coordinate            5285054
Year                    5366001
Updated On              5366001
Latitude                5285053
Longitude               5285053
Location                5285053
dtype: int64

데이터양이 많은 경우 이렇게 데이터 수를 세는 것만으로도 20초가 넘게 걸렸다.

Dask는 이러한 대량 데이터의 분석 작업을 돕기 위한 작업 스케줄러(task scheduler)라는 것을 제공한다. 작업 스케줄러는 하나의 작업을 여러개의 쓰레드, 프로세스, 노드 등이 나누어 분담하도록 한다.

현재 Dask에서 제공하는 스케줄러의 종류는 다음과 같다.

  • dask.get : 단일 쓰레드
  • dask.threaded.get : 멀티 쓰레드 풀(pool)
  • dask.mutiprocessing.get : 멀티 프로세스 풀
  • distributed.Client.get : 여러대의 컴퓨터에서 분산 처리

병렬처리를 위해서는 어떠한 병렬 처리 방식을 사용할지, 작업 프로세스의 갯수는 어떻게 할지 등은 compute 명령에서 인수로 설정해야 한다.

다음 코드는 멀티프로세싱을 하고 2개의 CPU 코어를 동시에 사용하도록 설정한 예이다. (물론 이 코드가 실행되는 컴튜터가 실제로 2개 이상의 코어를 가지고 있어야 성능이 개선된다.)

%%time
df.count().compute(scheduler='processes', num_workers=2)
[########################################] | 100% Completed | 15.6s
Wall time: 15.6 s





ID                      5366005
Case Number             5365999
Date                    5366001
Block                   5366001
IUCR                    5366001
Primary Type            5366001
Description             5366001
Location Description    5359222
Arrest                  5366001
Domestic                5366001
Beat                    5366001
District                5365954
Ward                    4751265
Community Area          4753051
FBI Code                5366001
X Coordinate            5285054
Y Coordinate            5285054
Year                    5366001
Updated On              5366001
Latitude                5285053
Longitude               5285053
Location                5285053
dtype: int64

실행되는 컴퓨터의 사양에 따라 다르긴 하겠지만, 처리속도가 빨라진 것을 볼 수 있다.

좀더 자세히 알아 보고 싶다면, 공식 문서를 살펴보자.

DASK Document (https://docs.dask.org/)

출처 : 데이터사이언스 스쿨(http://datascienceschool.net)

@winuss
Hello :) Developer notes!