kaggleに参加して巨大なCSVファイルを読み書きしていると、それだけで数分近くかかってしまうことがある。 そこで紹介されていたfeatherというDataFrame保存用ライブラリを使ってみた。 featherはpandasのDataFrameを高速に保存、ロードするために開発されたApache Arrowのpythonラッパーだ。
Apache Arrow特有のカラム型メモリ管理をすることで、データの読み書きを高速化しているそうだ。 ベースになっているApache Arrowが他言語や他オープンソース(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倍程度と非常に高速に動作することが確認できた。データセットの保存や読み込みに使えば大幅な時間の節約になる。 長期のデータには向いていない(破損とかに弱い?)そうなので、あくまで前処理したデータのキャッシュなどに使うのがいいと思う。