スポンサーリンク

2016年11月30日水曜日

howm + ripgrep のちょっとした問題

少し前に howm で ripgrep を使う記事を書きました。
http://extra-vision.blogspot.jp/2016/10/ripgrep-howm.html

しかし使い初めてすぐに気付いたのですが、howm-menu に表示されるメモの順番がおかしくなるのです。

通常 howm-menu はメモファイルのタイムスタンプでソートし、最後に更新したメモ(の見出し)を一番上に表示してくれます。これがどうにもちゃんと順番が揃いません。更に howm-menu を表示する毎に、メモの順番が少しずつ変わます。

最初は何が起こっているのかさっぱり分かりませんでした。そこで読めない elisp を苦労してトレースしてみると、howm 自身はファイルのソートを正しく行ない、そのファイルリストを ripgrep に引数として渡しています。しかし ripgrep の出力結果が引数の順番通りになっていないのです。


そこでハタと気がつきました。ripgrep の高速化の理由は並列処理に依るところが大きい、ということを。そうです、ripgrep は多数のファイルを検索する時、ファイル毎にスレッドを立ち上げ、複数ファイルを同時検索しているのです。そして検索が終わったところから順に出力します。つまり引数のファイルの順番が出力では保たれていないのです。

howm でメモを書いていると、メモファイルのサイズが小さいうちは最初の方に表示され、大きくなってくるとだんだん順番が下ってくる傾向がある事を何となく感じていまいしたが、これも説明がつきます。

ということで調べてみると、世界にはやはり同じことに気付いていた人がいました。
https://github.com/BurntSushi/ripgrep/issues/152

これを読むと、とりあえず -j1 オプションを付けることで問題を回避することはできます。しかしこの -j オプションは単に起動するスレッド数を制限するだけなので、これでは並列処理による高速化の恩恵を受けられません。

根本的には、ripgrep の作者に対策をしてもらわないと解決できない問題です。結果の取り出しにスレッドの同期が必要になります。マルチスレッドの練習問題としてちょっと面白そうな課題です。しかし上のリンクのやり取りを読むと、作者は今すぐには対応する予定はないようです。

howm で利用するにはちょっと不便かも知れません。howm-menu で表示順が不定になるのはちょっと気持の悪いものです。しかし howm-menu 以外のワード検索であれば ripgrep の高速性は十分有用です。なので私はまだ howm + ripgrep を使っています。

0 件のコメント :

コメントを投稿