Arrow、名前は知ってたけど縁遠いなあと思っていた。最近CSV処理するスクリプト書いてて、そういやデータフォーマットでArrowってあったなっと思って、ちょっと触ってみたのでした。結論、「正しく使えば」、速くなる。Arrowは新しいデータフォーマット。インメモリーでデータを扱う時に最適化されたフォーマット言語やプロセス間でのデータ交換を高速にするのを目標としている列指向のフォーマットという特徴を持っているらしい。PythonのPandasの開発者も開発の中心的人物みたい。これはArrow形式のファイル[1]の他、CSVやParquet形式のファイルも読み込めます。Arrow::Table.load("sample-data.csv")という感じ。CSV、Arrow、Parquetのベンチマーク「列指向」ってことだから(CSVは反対に行指向フォーマット)、一行一行を舐めるような操作は遅いのかな、とか思ったりしつつも、ほんとのところどうなんだろうとベンチマークを取ってみました。8個WSLはIOが遅いことで有名なのでその辺は差し引いてください。33MiBのファイルサイズ8万行ちょっとのデータ量のファイルを元にベンチマークを取ってみました。余談だけど、CSVファイルを調べるならxsvはすごく便利なコマンドなので是非入れよう。ベンチマーク後でスクリプトも置くけど、「ある列(数値)の合計値を計算する」という処理を行っています。Parquestでの同様の結果、となっている。)操作するべしということかな。「更に正しく使えば」Arrowが圧倒的に速かった。CSVを読み込んで何もせずArrowやParquet形式で保存しているので、対象カラムが文字列のままだからだ。本当は、ここをuint32とかuint64とかにして保存してやるとさらに高速化できるんだろうなと思いつつ、Arrowのテーブルからそういう別のテーブルを作る方法がいまいち分からないというか、気軽にベンチマークとる上ではめんどそうなので今日はやめました。仕事で使っててどうにもパフォーマンスが欲しいとなったら挑戦するかも。あと何となく時間できた時とか。気分になって、ダイクストラ法を実装してみようかと思った。Blog)モジュールとしてダイクストラ法をやる場所を作って、それから部品としてのグラフ、ノード、エッジを作ろうと思った。それがもううまくいかない。--verbose.こういう所でハマるのは、まさにそのために勉強しているわけなので歓迎なんだけど、それにしても分からん。なんでなんだろう......。https://gitlab.com/KitaitiMakoto/rust-algorithm/issuesあと、実はこっそりSlackのrust-jpチームにもいます。XMLライブラリーを切り替え可能にしているのだけど、そこでOgaも使えるようにしたというリリース。2.7の足音も近付いている昨今ですが、このOga対応中に2.6のRefinementsの使いやすさをすごく実感したので今日はそのことを話したい。ParserではXMLライブラリーをREXML、Oga、Nokogiriから選べるようになっている。ようなアダプターを作ってその中にライブラリーの詳細を隠蔽する。APIを使って、内部でアダプターがREXMLならREXMLのメソッド呼び出しに変換する、という方法だ。Parserではそういうラッパーは用意しなかった。メソッドを呼び出している。endなどと条件分岐するわけではない。その代わりに用いたのがRefinement、というわけだ。いうメソッドを呼び出すことにしているが、ご存じの通りどのXMLライブラリーにもこういう名前のメソッドは備わっていない。Parserで読み込んだ状態では各XMLライブラリーに未知のメソッドが生えることになってしまう。Parserを使ってHTMLコンテンツを読み込んで、それを自分の好きなXMLライブラリーでパースすることも割とあると思うのだけど、その時に意図しないメソッドが生えているのは嫌だ。そこで活躍するのがRefinement。定義してても、ユーザーが自分のXMLライブラリーを使う時にはそんなメソッドは無くなっている。REXMLとNokogiriの両方を使えるようにする際にこういう仕組みを導入した。今回、0.4.1のリリースでOga対応する時にもこれに則って必要な書くライブラリーを定義していった。困ることなく普通にRefinementを使って実装した後GitLabにプッシュするとCIが動く。テストの失敗を報告してくる。2.6のRefinementは過去のバージョンと比べて自然に使えるようになってるんだなあ、便利だなあ」と実感した次第だ。モジュールをrefineできるようになっている。2.4、2.5と違い、2.3のCIではテストを開始する以前にエラーが発生している。できて便利、と言うか、開発中はできることを疑わなかった。シンボルをブロック化する時にRefinementが適用される見出しだけだと何を言っているか分からないと思う。