2026-08-04(火)に開催されたRuby Association Activity Reportでpure Ruby Apache Arrow実装の活用方法という話をした須藤です。2025年度Rubyアソシエーション開発助成金プロジェクトとして開発したpure RubyのApache Arrow実装の成果報告でした。
関連リンク:
内容
内容は事前情報に書いたのでそちらを読んでください。
助成金事業のこととか次の日のRubyエコシステム開発入門ワークショップ2026-08のこととか、宣伝が多すぎてプロジェクトの内容が少なくなってしまっているとささださんからコメントをもらいました。ごめんなさい。
RubyでSIMD
Rubyで書いたらSIMDで速くなるとかっこいいなぁと思っています。たとえば、こういうことです。
sum = 0
numbers.each do |number|
sum += number # SIMDで速くなる!
end
sum
しかし、どう実現するのがそれっぽいかはいい案が浮かんでいませんでした。この日もあいかわらずそのことを考えていたのですが、まつもとさんと話をしてSpinelを使うのもいいかもなぁという気持ちになりました。
SpinelはRubyで書かれたコードをCのコードに変換できるAOTコンパイラーです。生成されたCのコードをCコンパイラーでビルドすれば実行ファイルを生成できますが、実行ファイルではなくて共有ライブラリーを生成してRubyの拡張ライブラリーとして使えるようにするのはアリという話を聞きました。この機能がうれしいポイントはCコンパイラーの最適化を効かせる余地がある点です。Cコンパイラーは賢いので、十分単純なループであれば最適化オプションを指定すればSIMD化してくれます。
ただ、RubyのArrayをそのまま扱えてもSIMDは使えません。SIMDを使うには対象データ(たとえばint64_tの数値配列)がCの表現(Rubyで表現された29のバイト列ではなくてCで表現された29のバイト列ということ)で連続したメモリー領域に並んでいなければいけないからです。RubyのArrayはそうなってはいません。
そこでMemoryViewですよ!MemoryViewはRubyオブジェクトが持っているデータをCの表現の連続データとして取り出すことができる機能を提供しています。たとえば、Apache ArrowデータはMemoryViewを使ってSIMDで使えるデータを提供できます。処理対象のRubyオブジェクトがMemoryViewに対応していて、連続データとして出力できる場合はSIMD可能なCのコードを生成できそうです。
これでいい感じに入力を渡して、いい感じにCの数値計算コードを生成できそうです。あとは、どうやって出力を受け取るかです。
前述の足し算のように値を集約するものは1つの値を返すだけなのでなんとでもなりそうです。一方、要素ごとに計算する場合はそうでもありません。たとえば、各要素を2倍するなら元のデータと同じ数の要素を返さないといけません。
doubles = []
numbers.each_with_index do |number, i|
doubles[i] = number * 2
end
ここで↑のようにRubyのArrayとして返してしまうと、この計算結果をさらに次のSIMD化された計算で使うことができません。
そこでIO::Bufferですよ!IO::BufferはRubyのコア機能の一つでC表現のデータを読み書きすることもできます。それに、最近MemoryViewに対応させておきました。IO::BufferにCの表現のまま書き込めばそのあとの計算処理もSIMD対応にできます。
という感じで、なんかいけそうな気持ちになったのでした。しかし、その後、Rubyエコシステム開発入門ワークショップ2026-08とか帰省とかOpenArmをインターネット越しにWebXRで遠隔操作できるようにするやつとかを作っていたりしてなにも進められませんでした。。。このレポートを書くところにたどり着くまでに1ヶ月弱も経っている始末。。。
で、久しぶりにSpinelをのぞいてみたらRubyの拡張ライブラリーを作る機能が昨日実装されていました。あとは、MemoryViewとIO::Bufferに対応させるだけです。だれか、興味ある人はいますか?一緒にやりたい人はRed Data Toolsのチャットに来てください。サポートします。Rubyアソシエーション開発助成金2026に応募してもいいかもしれません。その場合は、RubyGemsのビルドシステムとのインテグレーションまわりまで提案できるといいかもしれません。
まとめ
2026-08-04(火)に開催されたRuby Association Activity Reportで2025年度Rubyアソシエーション開発助成金プロジェクト「pure Ruby Apache Arrow実装の開発」の成果報告をしました。今回の成果でApache ArrowをサポートしたRubyのライブラリー・アプリケーションが増えるといいなぁと思っています。
このイベントのおかげでRubyで書くとSIMDで速くなるアイディアの実現案が浮かんだのでよい機会になりました。他にもいろんな人にゴニョゴニョ相談させてもらえて助かりました。
それはそうと、Apache Arrowに詳しい私にApache Arrow関連のサポートを頼みたいという場合はクリアコードのApache Arrowサービスをどうぞ。たとえばApache Arrow対応のサポートとかです。Ruby用のデータ処理ツールを提供することに興味がある人はRed Data Toolsをどうぞ。