• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:indexと正規表現はどちらが早い?)

indexと正規表現、どちらが早い?ファイルから特定の文字を検索する方法

このQ&Aのポイント
  • 30ファイルあるテキストファイルから特定の文字にマッチする行を調べたい。確認したい文字列の長さは10-20文字。perlを使って検索する場合、index関数と正規表現のどちらが効率的なのか疑問。
  • ファイルはアルファベットで構成され、各行の末尾は改行で区切られている。スペースは含まれていない。3-5GB程度の大きさ。
  • 他に良い方法やモジュールがあれば教えてほしい。

質問者が選んだベストアンサー

  • ベストアンサー
  • kuroizell
  • ベストアンサー率55% (95/170)
回答No.2

適当な事言わずにuse Benchmark qw(timethese cmpthese);。 a-zA-Zのランダム一行40字、100万行(40MB)を indexとregexで検索文字列15字にマッチした行をカウント、 これをそれぞれ100回実行したところ、大差なし。 僅かに正規表現の方が早いですね。 ちなみにregqrは、$search_word = qr/hoge/を使ったものです。 index: 83 wallclock secs (78.55 usr + 4.34 sys = 82.89 CPU) @ 1.21/s (n=100) regex: 75 wallclock secs (72.00 usr + 3.53 sys = 75.53 CPU) @ 1.32/s (n=100) regqr: 74 wallclock secs (69.78 usr + 3.62 sys = 73.41 CPU) @ 1.36/s (n=100) Rate index regex regqr index 1.21/s -- -9% -11% regex 1.32/s 10% -- -3% regqr 1.36/s 13% 3% --

Myc
質問者

お礼

回答ありがとうございます。 疑問が解決しました。 indexの方が早いとは予測していたのですが、思っていたほど違いはないんですね。これだったら、より柔軟に文字列を設定できる正規表現を使おうかと思います。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • kuroizell
  • ベストアンサー率55% (95/170)
回答No.4

ちょっと気になったので、追記しておきます。 index関数との比較ということで、固定された検索ワードと理解しています。 従って、私の取ったベンチは、$str =~ /hoge/のようなリテラルでのパターンマッチ速度です。 正規表現というのは本来 /^[a-fA-F]{4}\d{2,10}.+$/のようなもので、 単純に$str =~ /h.{2}e/としただけでも、indexの方が早くなってきます。

Myc
質問者

お礼

補足の説明をありがとうございます。 今回の解析では、固定された検索ワードで検索するだけでしたので、ANo.2の回答で問題ありません。 気遣いありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • kuroizell
  • ベストアンサー率55% (95/170)
回答No.3

いや、一割早ければ大差ある・・・・かな? 私のマシンなら、30ファイル全部やって41分→37分になる計算。 やっぱり大差ないか。

Myc
質問者

お礼

40分のうちの4分程度の差でしたら、ずっとパソコンの前に座っているわけでもないので、あまり変わらない印象ですね。

全文を見る
すると、全ての回答が全文表示されます。
  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.1

単純に考えたら 挙動が単純なindexに部があるね。 スペースの無いアルファベットのみっていうのが曲者だと思うけれど、複雑になればなるほど処理に時間がかかるから、より単純な探索のindexがどんどん有利になると思うよ。 ただ、ちょっと複雑な「置換」となると 想定の置換数と文字の長さで変わってくるんじゃないかな。

Myc
質問者

お礼

回答ありがとうございます。 やはり、そうですよね。 どのくらい違うのかが気になります。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Perl 正規表現に関して

    現在Perlにて正規表現を用い,アクセス者のログが納めてあるlog.datからデータを検索し集計するといったアルゴリズムです. ところが正規表現を用いたのは良いものの,アルファベット以外をパターンとして使用したとき,データを呼び出すどころか表示されない状況に陥ってしまいました. elsif($referer =~ /abcd/i) { $word2 = "abcd"; } 上記のコードは,パターンがアルファベットで構成されているため,正常にシステムが動作します. elsif($referer =~ /あいうえ/i) { $word2 = "あいうえ"; } しかし,上記のコードはパターンが平仮名で構成されているため,冒頭で記している問題が発生してしまいます. そこで (1)パターンにアルファベット以外のものは使えるのか. (2)パターンにアルファベット以外のものを使いたいときはどうすればいいのか. についてお教えください. また正規表現のほかに,文字列を検索し,頻度をカウントすることに長けているコードがございましたらお教え願います. 以上の内容で不明な点等ございましたら随時対応致します. 宜しくお願いします.

    • ベストアンサー
    • Perl
  • 正規表現について

    正規表現につての質問です。 今テキストファイルに下記のような漢字と数字が並んでいます。 そこから、漢字一文字だけの行を抜き出してきたいのですが、うまくいきません。PerlとCygwinを使用しています。よろしくお願いします。 人584504122 情報542701982 商品510342870 日414551872 方347990908 者347069359 中339925319 表示330177395 的324961911 私323727263 検索291502623 見ル285226619 場合275698771 一256241900 利用253752129 年240881734 時239273060 前228762989 店225241510 登録224560617   ・   ・    ・ プログラム中身 #! /usr/bin/perl -w #テキストから指定した単語などとマッチすると、 #その単語を含んだ文を抜き出してくる。 while(<>){ s/ +//g; s/\s+//g; if(/^([亜-煕]|[一-龠]){1}[0-9]*/){ print; print "\n"; } }

  • 正規表現の添削をお願いします

    アルファベットと数字とスペースと「-」のみで構成される任意の長さの文字列をjavaの正規表現であらわしたいです。 [\s0-9a-zA-Z-]+ でいいのでしょうか? 最後の「-」がまずいような気がするのですが、[-]はどこに持っていくのが正しいのでしょうか。 他にも間違っているところがありましたら、教えて下さい。

  • 正規表現について

    お世話になります。 ●●● ●●● という文字列かどうか判断する正規表現を作成したいです。 条件としては、 ・「文字1 (←全角スペース)文字2」という感じで、文字1と文字2に全角スペースが挟まれている感じで、文字列の先頭にも末尾にも空白文字は入ってはいけない(真ん中に1つのみ) ・文字1と文字2には、数字・空白以外の文字が入る(主に感じ・ひらがな・カタカナが入る)(文字数は一文字以上) といったところです。 自分で作成した正規表現は、 $pattern = '/^([\d\S])+ ([\d\S])+$/'; if( !preg_match($pattern,$chkStr) ) print "マッチしていない"; } なんですが、どうもマッチしてほしい文字にマッチしていないようなのです。 お手数ですがご教授ください。

    • ベストアンサー
    • PHP
  • 正規表現を教えてください。

    正規表現を教えてください。 C#で正規表現を用いた文字列検索を勉強中なのですが、うまくマッチさせることができません。教えていただけないでしょうか。 検索対象の文字列は下のようになります。 キーワード;値; 文字列中に該当するキーワードが存在する場合に、その値を取得するプログラムを考えています。しかし、私の正規表現では2つ目の「;」を検出してしまい、キーワードのみを取得することが出来ずに困っています。 見当違いの表記をしているとは思うのですがどなたかお助けください。 match = Regex.Match(line, "^(.*);"); C#初心者なものです。

  • 正規表現での検索がうまくいきません…

    質問させて下さい。 WindowsにてAtivePerlの5.8.6.811を使っています。 サーバはAnHttpdです。 htmlの文章ファイルを読み込んで、空白行で区切ってリストに読み込み、そのリストを配列ごとに正規表現で検索して、マッチしたものだけをhtmlで表示しようとしています。 ところが、検索結果にどうにも変な時があります。 少し試したところ、「ゲーム」「ラッキー」などの「ー」が入る文字を検索しようとすると、全く処理をしてくれないのです。 その上、そのパターンマッチ検索のスクリプトより下に書いた行が全て実行されなくなってしまいます。 Shift-JISで書いているので、ダメ文字の類なのかとも思い、シングルクォートで囲ったり、「ー」の後に\をいれてみたりもしましたが、変化ありません(十や表はこれでうまくいきました…)。 また、それ以外にも、「スイス」などという、絶対に書かれていない単語で検索しても、検索されてしまう配列があったりします。 これに至っては完全に謎です…。 分かる方がいらしたら、どうかよろしくお願いします。

    • ベストアンサー
    • CGI
  • 正規表現の逆?

    検索対象の文字列が、正規表現で言うなら あい(う|え)かきく(け|こ)さ・・・ という感じであります。 それを検索したい文字列(1000個程度)の入ったファイルを順に読み込み、マッチしたら切り出し、さらに検索を続けて切り出していくという処理をしたいのですが、何から手をつけていいかわかりません。 どなたか教えてください。

  • 正規表現/スペース以降改行までのグローバルマッチ

    JavaScript正規表現で、「スペース1つ」以降「改行」までのグローバルマッチを行いたいのですが、うまくいきません。 ■マッチさせたい内容 ・年末なのに ここをマッチさせたい ・正規表現が ここもマッチさせたい ・ ここもマッチさせたい ・ここはマッチさせたくない ・ここはマッチさせたくない ■うまくいかない正規表現 /\s{1}.*[\n\r]/g

  • 正規表現で分かりません

    例えば以下のようなパターンの正規表現チェックがあるのですが、 どのようなものを意味しているか分かりません。 教えていただけますでしょうか。 よろしくお願いします。 以下の情報は調べたのですが。 +(プラス)・・・直前の1文字の1回以上の繰り返しを表現 . (ピリオド)・・・改行コード以外の1文字にマッチするか否か [ ](大括弧)・・・囲みの中に書かれた任意の1文字にマッチするか否か ^([^ ]+) +[^ ]+.+S3.lzh

  • java正規表現について

    bufferdreaderで読み込んだファイルを1行ずつ読み込みます。そして、arraylistに追加していきます。そして、各行に”JP”という文字列があれば、表示しないプログラムを作りたいです。 (".*JP.*")だとうまくいきません… ちなみに、文頭、文末、文中どこでも検索できるようにしたいです。 よろしくお願いします。

    • ベストアンサー
    • Java