kaggleに参加して巨大なCSVファイルを読み書きしていると、それだけで数分近くかかってしまうことがある。 そこで紹介されていたfeatherというDataFrame保存用ライブラリを使ってみた。 featherはpandasのDataFrameを高速に保存、ロードするために開発されたApache Arrowのpythonラッパーだ。
Apache Arrow特有のカラム型メモリ管理をすることで、データの読み書きを高速化しているそうだ。 ベースになっているApacheArrowが他言語や他オープンソース(SparkやHadoop)との互換性を重視しているために、feather形式で保存すればRなどでも読み込める。
featherのインストールはpipから簡単にできる。
$ pip install feather-format
使い方も簡単でwrite_dataframe、read_dataframeを呼ぶだけ。
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_featherやpandas.read_featherというメソッドが追加されているので、以下のような方法でも使える。
import pandas as pd
#データフレームの読み込み
df = pd.read_feather(path_feather)
#データフレームの書き込み
df.to_feather(path_feather)
約18列、150000行のデータのデータセットで、csvとfeatherそれぞれの読み書きの速度を計測すると、
# csvからの読み込み
%time df = pd.read_csv(path_csv)
# feather formatからの読み込み
%time df = pd.read_feather(path_feather)
%time df = feather.read_dataframe(path_feather)
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
# csvへの書き込み
%time df.to_csv(path_csv)
# featherへの書き込み
%time df.to_feather(path_feather)
%time feather.write_dataframe(df, path_feather)
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倍程度と非常に高速に動作することが確認できた。データセットの保存や読み込みに使えば大幅な時間の節約になる。 長期のデータには向いていない(破損とかに弱い?)そうなので、あくまで前処理したデータのキャッシュなどに使うのがいいと思う。