Dask メモリにのらない大規模なcsvデータの取扱について
Dask?
大規模なデータセットの並列処理用のライブラリ
なんで必要?
この記事を書いている時点(2018/11/11)で,kaggleのkernelのメモリが17.2Gしかないので,10Gぐらいあるcsvを読み込もうとすると,メモリエラーが起きます。
これを回避する方法として,pandasのread_csv
のchunksize
を指定してあげることがあります。
kernelとか見てると計算できていますし,それでもいいんですがchunksizeの間でデータセットが別れてしまうのが怖かったので,どうにかできる方法がないか調べているとDask
というライブラリがありました。
Dask: Scalable analytics in Python
Dask
を使うことで,メモリにのらないデータであってもよしなに計算してくれます。
これ以外にもblaze
というライブラリもあったのですが,githubの更新が二年ほど止まっているので使うのをやめました。
Ecosystem — Blaze 0.11.3+36.g2cba174 documentation
どう使う?
今回勉強したのはdataframeのところだけなのですが,そこだけを見るとpandasのように使えました。
import dask.dataframe as dd ddf = dd.read_csv(`foo.csv`)
これで読み込みができます。ただ,中身のコードを呼んでないので,実際読み込まれているわけではなさそうです。
使用メモリサイズとpythonコンソールで出力されるddf
を見てみる限り,csvファイルのcolumnsに少しだけアクセスしているように見えます。詳しい人がいれば訂正してください。
で,これのddf
に対してpandasの基本的な関数はそのまま計算できるようです。例えば,
df = ddf["foo1"].max()
や
df = ddf.query("foo1 > 100")
などでpandasのdataframeを返す「準備」ができます。最後に,
df = df.compute()
とcompute()
を実行することで,計算を返してくれます。
このタイミングでメモリ内にデータを配置して計算を進めてくれるようです。kaggleのkernelのメモリ使用量から判断しました。
まとめ
Dask
- メモリにのらないデータでも,よしなにやってくれるライブラリです。
- Dataframeのmethodはpandasの関数をそのまま使ってくれます。
- 大きなcsvファイルでもそのまま計算を行ってくれるので非常に便利です。