はじめに
皆さんはApache arrow
というものをご存じでしょうか。
先日、Polarsについての記事を書きましたが、調査を進める中でApache arrowに関する、良さげな情報があったので、記事にまとめたいと思います。
前回記事↓
Apache arrowとは
Apache arrowは、メモリ上のデータ表現とデータ交換のための汎用的なオープンソース規格です。
特徴としては、
- 列指向のメモリフォーマットを使用し、効率的なデータ処理を可能に
- 異なるシステムやプログラミング言語間でのデータの相互運用性を提供
- ゼロコピーのデータ共有により、データのシリアル化とデシリアル化のオーバーヘッドを削減
- 高速なデータ処理とメモリ効率の良いデータ交換を実現し、ビッグデータ処理のパフォーマンスを向上
といった感じです。
データサイエンス、機械学習、ビッグデータ処理など、データ集約型のワークロードにおいて、異なるシステム間でのシームレスなデータ交換と高速な処理を可能にします。
PolarsとpandasにおけるApache arrow
実は、PolarsがPandasと比べメモリ効率に優れている理由の一つが、このApache arrowです。
Polarsでは、Apache arrowが内部に組み込まれているため非常に高いメモリ効率性を有しています。
一方で実はPandasでもApache arrowを使用することができるそうです。
使用する際には以下のようにします。
import pandas as pd
df = pd.read_csv(data_path,
engine='pyarrow')
read_csv()
の引数にengine='pyarrow'
を指定してあげるだけです。
pyarrowとは、Apache arrowのPythonバインディングです。
速度比較
では、Pandas(Arrows未指定)、Pandas(Arrows指定)、Polarsで速度比較してみましょう。
読み込むデータは以下のコードで作成しました。
import pandas as pd
import numpy as np
# ダミーデータの生成
num_rows = 1000000
num_cols = 100
data = np.random.rand(num_rows, num_cols)
columns = [f'column_{i}' for i in range(1, num_cols + 1)]
df = pd.DataFrame(data, columns=columns)
# CSVファイルに保存
output_file = 'large_data.csv'
df.to_csv(output_file, index=False)
実際にそれぞれ読み込んでいきましょう。
# pandas(Arrows未指定)
import pandas as pd
df = pd.read_csv(data_path)
# Pandas(Arrows指定)
df = pd.read_csv(data_path,
engine='pyarrow')
# Polars
import polars as pl
df = pl.read_csv(data_path)
# Pandas(Arrow未指定):15.2s
# Pandas(Arrow指定):3.3s
# Polars:1.2s
結果として、
Polars > Pandas(Arrows指定) >> Pandas(Arrow未指定)
でした。
Pandasでも十分な速度を出すことができるようですね!
ただ、それでもPolarsには劣るようです。
Rust言語で書かれていることなんかも要因なのでしょうか?
まとめ
今回はApache arrowについてまとめていきましたが、いかがだったでしょうか。
PandasでもApache arrowを使用することで、高速な処理が可能であることが確認できたかと思います。
ただ、前回の記事でも触れましたが、Polarsの性能の良さはすごく、やはり移行した方がいいとい感じています。
Polarsに慣れない方はApache arrowを使用してみてもいいかもしれませんね!
それでは!!!