Shellシェル芸家元から放たれたシェル芸本第2弾。相変わらずの切れ味で荒ぶる漢のUNIX道が展開されている。上田ブログこの本の5章は、大きなデータを処理するというテーマ。その中でシェルのバックグラウンド処理機能を使い、並列処理で高速化を図る記載がある。ボトルネックになる高負荷なプロセスがある場合は、並列処理させる方が高速化出来るということ。ファイルがキャッシュにのった場合は、複数のプロセスから同時に読み込みが出来る。いうことで、ちょっとgrepを使った並列処理のネタを思いついた。扱うデータは、シェル芸界隈で使われる下記のような1億行4GBのテキストデータ。値の意味は特に無くてランダムなデータのようだ。2008年12月7日まずはファイルをメモリキャッシュに乗せる。grepは超高速であり、簡単な検索なら1億行を4秒足らずでさばいてしまう。4県分のデータを取り出す>>>OR検索になるので、パイプをつないで絞り込むことは出来ない(よね?)。拡張正規表現を使うgrepの拡張正規表現を使う方法。普通はこちらを思いつくかな?grepの拡張正規表現を使ってこんな感じ。0m0.792sあれあれ、かなり処理速度が落ちてしまう。拡張正規表現でOR検索すると、速度低下の影響が大きいようだ。バックグラウンドによる並列処理ではせっかくのマルチコアマルチスレッドを活用するために、シェルのバックグラウンド機能を使う。0m4.190sマルチコアが生かされて高速に処理が出来た。出力結果は順番が狂っていると思うが、とにかく絞り込むだけならこちらの方法が圧倒的に早くなる。ちなみに改行せずに書くなら、下記のような書き方に。{}カッコの場合は最後を;で終わらないといけないので注意。()カッコの場合は、サブシェルで動いている。/dev/nullまとめgrepの拡張正規表現を使ったOR検索は処理速度低下が大きいマルチコアなら簡単なgrep検索をバックグラウンドで並列処理すれば早い参考Twitterでこんなコメントいただいた。TESTDAT」なんてのも良いかも。正規表現を使わず固定文字列ならこれが早い。情報処理の基本とも言うべきシェルワンライナーの勉強会。はてなブログPro情報処理ってもっとシンプルにならないだろうか?PKI関連、RubyやPHP等のLL、シェルスクリプト、シェル芸、ユニケージ見習い未満。シェルスクリプトとシェル芸はきっと違うんですよ。JPはてなブログをはじめよう!papiroさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。