うまい寿司が食いたい。

うまい寿司が遠慮なく食べれるようになるまで,進捗とか垂れ流すブログ

Dask メモリにのらない大規模なcsvデータの取扱について

Dask?

大規模なデータセットの並列処理用のライブラリ

なんで必要?

この記事を書いている時点(2018/11/11)で,kaggleのkernelのメモリが17.2Gしかないので,10Gぐらいあるcsvを読み込もうとすると,メモリエラーが起きます。
これを回避する方法として,pandasのread_csvchunksizeを指定してあげることがあります。
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ファイルでもそのまま計算を行ってくれるので非常に便利です。