2018-5-12

feather - pandasの読み書きを高速化

kaggleに参加して巨大なCSVファイルを読み書きしていると、それだけで数分近くかかってしまうことがある。 そこで紹介されていたfeatherというDataFrame保存用ライブラリを使ってみた。 featherはpandasのDataFrameを高速に保存、ロードするために開発されたApache Arrowのpythonラッパーだ。

Apache Arrow特有のカラム型メモリ管理をすることで、データの読み書きを高速化しているそうだ。 ベースになっているApacheArrowが他言語や他オープンソース(SparkやHadoop)との互換性を重視しているために、feather形式で保存すればRなどでも読み込める。

featherのインストールはpipから簡単にできる。

bash
Copied!
$ pip install feather-format

使い方も簡単でwrite_dataframe、read_dataframeを呼ぶだけ。

python
Copied!
import feather
import pandas as pd

#データフレームの読み込み
df = feather.read_dataframe(path_feather)

#データフレームの書き込み
feather.write_dataframe(df, path_feather)

またpandasのバージョン0.20.0からpandas.DataFrame.to_featherpandas.read_featherというメソッドが追加されているので、以下のような方法でも使える。

python
Copied!
import pandas as pd

#データフレームの読み込み
df = pd.read_feather(path_feather)

#データフレームの書き込み
df.to_feather(path_feather)

約18列、150000行のデータのデータセットで、csvとfeatherそれぞれの読み書きの速度を計測すると、

読み込み速度

python
Copied!
# csvからの読み込み
%time df = pd.read_csv(path_csv)

# feather formatからの読み込み
%time df = pd.read_feather(path_feather)
%time df = feather.read_dataframe(path_feather)
text
Copied!
CPU times: user 29.1 s, sys: 27.7 s, total: 56.8 s
Wall time: 1min 38s
CPU times: user 5.53 s, sys: 10.1 s, total: 15.6 s
Wall time: 37.7 s
CPU times: user 5.46 s, sys: 11.1 s, total: 16.5 s
Wall time: 35.7 s

書き込み速度

python
Copied!
# csvへの書き込み
%time df.to_csv(path_csv)
# featherへの書き込み
%time df.to_feather(path_feather)
%time feather.write_dataframe(df, path_feather)
text
Copied!
CPU times: user 53 s, sys: 11.4 s, total: 1min 4s
Wall time: 1min 30s
CPU times: user 18.3 s, sys: 10.1 s, total: 28.4 s
Wall time: 39 s
CPU times: user 18.8 s, sys: 8.76 s, total: 27.5 s
Wall time: 35.5 s

実時間で読み書きともに約2.5倍程度と非常に高速に動作することが確認できた。データセットの保存や読み込みに使えば大幅な時間の節約になる。 長期のデータには向いていない(破損とかに弱い?)そうなので、あくまで前処理したデータのキャッシュなどに使うのがいいと思う。