神速Grep


神速のヒミツ

VBAで通常使用される高速化技法に加えて、以下の独自の工夫を行っています。

固定文字列検索

入力された正規表現を解析して、検索結果には必ず含まれる固定文字列を抽出します。
例えば、次のようなjpドメインのurlを検索する次の正規表現「https?://(www\.)?.*?\.jp/」に
マッチする文字列には、固定値「http」が必ず含まれていることになります。
そこで、Excel標準の検索機能でこの固定文字列「http」を検索して、ヒットしたセルにのみ、
さらに、「https?://(www\.)?.*?\.jp/」での検査を行っています。

全てのセルに対して、入力されたフル正規表現での検査を行うより、通常は速く処理できます。
全てのセルや多くのセルに「http」が含まれている場合は、逆に遅くなります。
(標準の検索による検査のスキップ数が少なくなるため)
しかし、通常、検索作業を実施する場合は、対象全体から少数のものを探索することが多いと
思われるため、多くの場合、高速に処理できます。

デフォルトではこのExcel標準の検索を使用するようになっていますが、設定で使用しないようにもできます。

マルチプロセスによる並列処理

CPUがマルチプロセッサの場合、高速モードGrepがデフォルトでオンになっています。

高速モードGrepでは、マルチプロセスでGrep作業を並列に実行します。
具体的には、作業を監督するリーダー1人+作業者5人で作業します。
作業者5人は、最初は均等に作業を分担しますが、速く自分の分が終わった人は、
まだ終わっていない人の作業を引き取っていくようにして、トータルで速く終わるようにしています。

リーダーから作業者への指示出し、作業者の作業終了後のリーダーのまとめ作業などがあるため、
5人で実施しても、5倍の速さにはなりません。
約2.5倍の速さになります。

経験型インデックスの使用

また、高速モードGrepでは、経験型インデックスを使用します。
経験型インデックスはGrepを実施するたびに蓄積されます。
固定文字列検索の固定値が、あるファイルになかった場合、その情報を記録します。

Aファイル、最終更新日2016/08/07 19:00:00、固定文字列キーワード「http」なし

のようなイメージです。
次回以降に、その情報を参照して、ファイルのタイムスタンプが更新されていない場合、
今回検索固定文字列を記録情報と照合します。
その結果、前回までに存在しないことがわかっている場合、そのファイルの処理をスキップします。

「前に検索して存在しなかった。ファイルは更新されていないので中身は同じ。だから今回もない。」
という考え方です。
または、「一度戦った相手には絶対に負けない」という方式です。

経験型インデックスは限定された検索の場合は、使用、蓄積しません。
具体的には以下の場合に使用、蓄積します。

■セルのGrep、Grep置換時
 ・数式での検索(デフォルト)
 ・標準の検索を使用(デフォルト)

■シェイプのGrep、Grep置換
 ・すべてのシェイプを対象(デフォルト)
 ・SmartArt含む(デフォルト)
 ・Excel2003以前のシェイプGrep置換時は、グループ化解除+再グループ化

■共通
 ・固定文字列キーワードに英字が含まれている場合、大文字小文字を区別しない
  (大文字小文字を区別しないはデフォルト)

Excel2003以前のシェイプGrep置換以外は、デフォルトの設定で経験型インデックスを使用します。

経験型インデックスの自動メンテナンス

高速モードGrepがオンになっている場合は、Excelの起動時に裏で
経験型インデックスの自動メンテナンスを行います。
経験型インデックスの中身がある場合に、そこに記録されているファイル1件1件に対して、
以下の方法で最新化します。

@ファイルが存在しない場合は、そのファイルについての情報を削除。
Aファイルが存在するがタイムスタンプが異なる場合は、記録されている非存在キーワードの再確認。
Bファイルが存在する場合、検索履歴(最大10件)の固定文字列キーワードの存在確認。

Bにより、Grep未実施の検索文字列でも経験型インデックスが効いて高速に処理される可能性があります。

この自動メンテナンスは裏で行っており、かつ、必要に応じて処理を中止するため、
作業に支障をきたしません。


正規表現検索に戻ります

トップに戻ります


お探しの情報は見つかりましたか?
まだの方はこちらをどうぞ。
Google

PageTop