TL;DR
通常の grep
や ag
よりも圧倒的に早いという**「RipGrep」(rg
)を Raspbian にインストールする**方法と簡単な使い方です。
MacOSX へ入れてみたり、さくらのVPS(CentOS7)に入れて見たところ非常に早かったのですが、 RaspberryPi3 + Raspbian(Jessie, Debian8.0)にインストールする場合の情報が少なかったので、軽いストレス・テスト(実測)をかねて記事を書いてみました。
結論を言うと 10.5GB のファイルを全文検索してgrep
と比較して 30 秒以上の差が出ました。
TS;DR
RipGrepとは
RipGrep(rg
)は、grep
に似たコマンドライン・ベースの UTF-8 対応テキスト検索ツールです。
BurntSushi 氏によって Rust
で書かれており、Silver Searcher
(ag
) の使いやすさと GNU grep
(grep
)の本来のスピードを兼ね備えています。 Windows, Mac, Linux などの OS で動作します。
インストール
Raspbian Buster では apt
でインストールできます。ARMv6l
(ラズパイ Zero W)アーキテクチャでも動作しました。
sudo apt install ripgrep
$ sudo apt install ripgrep
...
$ rg --version
ripgrep 0.10.0
-SIMD -AVX (compiled)
上記でインストールできない場合は下記でお試しください。
cd ~/
# 依存ファイルのインストール(基本デフォルトのまま進んでOK)
curl https://sh.rustup.rs -sSf | sh
sudo apt-get install debhelper
sudo apt-get install devscripts
sudo apt-get install quilt
# cargoのパスを通す
source $HOME/.cargo/env
# ripgrepのインストール
cargo install ripgrep
使い方
rg 'メキシコ'
正規表現も使えます
rg '1[^7][0-9[0-9]年'
詳しくはrg --help
コマンドでヘルプをご覧ください。
実測してみた
Wikipediaからダウンロードした 10 ギガバイトの XML のテキストファイルから「メキシコ」という単語を検索して、その結果をファイルに書き込み終えるまでの速度を比較してみました。
ファイルサイズ | 検索単語 | 平均秒数 | 差分 | |
---|---|---|---|---|
grep | 10.5GB | 'メキシコ' | 502 | +35 |
rg | 10.5GB | 'メキシコ' | 467 | 0 |
測定方法
コンマ何秒というレベルの差ではないため、linux の $SECONDS
を使って経過時間を測定します。
検索開始前に $SECONDS
のカウンターをリセットし、検索結果をファイルに書き込んだ時点までの秒数を測定しています。
留意点として、データ量が大きいため USB2 の外付けハードディスクに保存しての測定なので本来はもう少し早いと思います。
検証データの準備
Wikipedia の日本語データを、外付け HDD(/mnt/hdd1/wikipedia
) にダウンロード&展開します。10.5 ギガバイト程度あるのがわかります。
$ cd /mnt/hdd1/
$ wget https://dumps.wikimedia.org/jawiki/latest/jawiki-latest-pages-articles.xml.bz2
$ bunzip2 jawiki*
$ ls -la
合計 10285620
drwxr-xr-x 3 root root 4096 7月 24 17:38 .
drwxr-xr-x 3 root root 4096 7月 15 01:36 ..
-rw-r--r-- 1 root root 10532457736 7月 22 02:23 jawiki-latest-pages-articles.xml
測定
grep
$ cd /mnt/hdd1/
$ SECONDS=0 && grep 'メキシコ' *.xml > ~/result_grep.txt && echo ${SECONDS}
秒 | 分:秒 |
---|---|
502 | 8:22 |
502 | 8:22 |
500 | 8:20 |
504 | 8:24 |
501 | 8:21 |
平均 | --- |
502 | 8:22 |
rg
$ cd /mnt/hdd1/
$ SECONDS=0 && rg 'メキシコ' > ~/result_rg.txt && echo ${SECONDS}
秒 | 分:秒 |
---|---|
455 | 7:53 |
463 | 7:43 |
463 | 7:43 |
478 | 7:58 |
475 | 7:55 |
平均 | --- |
467 | 7:47 |