vaexのdataframeのcolumnとrowの数による性能の違いの調査

手元のデータで特徴量の次元が10万超えのものがあり、vaexを使ってみたが、速く感じられない。そこで、dataframeの columnとrowによって処理性能に差があるのか試してみた。結果からみると、row数が多いものは高速に処理できるが、column数が多いデータフレームは高速には処理できないということである。

評価の条件

実行環境

Google ColaboratoryのCPUインスタンスで実行した。Google Driveは、インスタンスにマウントして使用した。

プログラム

jupyter notebookファイルをGitHubの次の場所に置いた。

https://github.com/kunsen-an/vaex-test/blob/master/vaexTest_200323b.ipynb

プログラムの流れは以下の通り。

dataframeのcolumnとrow をそれぞれ2の10乗(1024)から15乗(16384)まで変えながら、下記の処理時間を計測した。

pandasでdataframeを作成し、それをcsvファイルに書き出し(pandas.to_csv)、それをpandasのデータフレームに読み込む(pandas.read_csv)。次に、pandasのデータフレームからvaexのデータフレームへ変換し(vaex.from_pandas)、それをhdf5に書き出す(vaex.export_hdf5)。

ローカルドライブにhdf5ファイルを作成した後に、hdf5をオープンし(vaex.open)、vaex.describe を実行して時間を計測する。

その後、hdf5をGoogle Driveに移動し、Google Driveにあるhdf5をオープンし(vaex.open)、vaex.describe を実行して時間を計測する。

データ量

dataframeは最大2の30乗個の要素があり、1要素が4バイトとすると、データ要素だけで4GBであり、dataframeの管理部分を含めてもColabのCPUインスタンスのRAMに収まる大きさのデータである。

評価結果

1回だけ実行した結果のグラフも上記のjupyter notebook (.ipynb)ファイル内にある。その一部を以下に示す。グラフの縦軸の単位は秒である。

ローカルドライブ上のhdf5ファイルのvaex.open

試した1024から16384までの範囲では、rowを増やしてもあまり実行時間に差はないが、columnを増やした場合には、線形以上に実行時間がかかる。

ローカルドライブ上のhdf5をopenしてからのvaex.describe

試した1024から16384までの範囲では、rowを増やしてもあまり実行時間に差はないが、columnを増やした場合には、ほぼcolumn数に比例した実行時間がかかる。

まとめ

10万超えのcolumn数がある手元のデータをvaexを利用することで高速に処理できればと思っていたが、あまり効果が見られないようだ。もっとも、利用したプログラムではすべてのcolumnをアクセスしているので、遅延評価などで無駄な処理を省略して高速化することができないのは当然と言える。

row数が多い場合には効果があるようであり、そのような場合に使うのが適切であろう。また、試した環境では効果を示すことができていないが、並列処理できる場合にマルチプロセッサであれば速くなるので、そのような場合にもvaexは有効であろう。