Pandasを並列動作させて高速化(Modin)

Modin

pythonでTableデータを扱おうと思うとPandasを利用することになると思いますが,Pandasでの操作を遅く感じることが多々あります. どうすれば簡単に早くなるか調べていたところ,Modinというモジュールに出会いました. 自分の備忘録としてModinについて記載します.

ModinはPandasを高速化するためのProjectで,もともとray project配下にあったようですが,今はray projectから独立して開発が続いています.pandasのimport分を変えるだけで高速化できるという謳い文句で宣伝していました.下記のように1行変更するだけで利用できます.

# import pandas as pd
import modin.pandas as pd

こうやってほとんど変更なしに利用できるのはありがたいですね. バックエンドはray, daskの2種類があり,環境変数でどちらをバックエンドにするか選択できます.

export MODIN_ENGINE=ray  # Modin will use Ray
export MODIN_ENGINE=dask  # Modin will use Dask

インストール

バックエンドをどれにするかによって以下の3つのパターンのインストール方法があります.

pip install 'modin[ray]' # Install Modin dependencies and Ray to run on Ray
pip install 'modin[dask]' # Install Modin dependencies and Dask to run on Dask
pip install 'modin[all]' # Install all of the above

詳細はgithubを参照ください.

性能

Modinのページを見ると,csvからDataFrameに変換する操作が4core利用の場合,4倍に高速になると記載があります. read_csv_benchmark.png

実験

軽く自分でも実験してみたところ数MBほどのデータだと,素のPandasの方がread_csvは早く,数GBのcsvだとModin(ray)の方が早かったです.(実行時間はデータの形状にも依存があると思います.) 以下の表はread_csvのpandas, modin(ray)の実行時間の比較です.csvは1.4GB,CPUは"Intel(R) Core(TM) i7-7700K"でread_csvの実行時間を20回測定した平均です.

pandas modin(ray)
read_csvの実行時間 [s] 8.39 3.09

だいぶ高速化できてますね.他の操作の実行時間もどうなっているのか気になるところです. 所感としては大規模のデータのときはModin利用して高速化していこうかなと思っています.