アプリ版:「スタンプのみでお礼する」機能のリリースについて

1行につき40文字前後で(固定長ではない)、1ファイルにつき約1億行書かれたファイル(1ファイルにつき3-5GB程度のテキストファイル)が30ファイルあります。ファイルは、すべてアルファベットで構成されていていますが、スペースは含まれておらず、各行の末端は改行(\n)で区切られています。これらのファイルからある特定の文字に完全にマッチする部分が含まれる行が各ファイルごとに何行あるのかを調べたいと思っています。検索する文字列の長さは10-20文字のものをいろいろと調べたいと思っています。

この作業をperlで行う場合、index関数を使って検索をするのと、正規表現を使って検索をするのでは、どちらが早いのでしょうか?もしくは、他に良い方法やmoduleがあるようでしたら教えてください。
よろしくお願いします。

A 回答 (4件)

適当な事言わずに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% --
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/09/16 23:32

ちょっと気になったので、追記しておきます。



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

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

お礼日時:2011/09/16 23:32

いや、一割早ければ大差ある・・・・かな?


私のマシンなら、30ファイル全部やって41分→37分になる計算。
やっぱり大差ないか。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/09/16 23:32

単純に考えたら 挙動が単純なindexに部があるね。


スペースの無いアルファベットのみっていうのが曲者だと思うけれど、複雑になればなるほど処理に時間がかかるから、より単純な探索のindexがどんどん有利になると思うよ。

ただ、ちょっと複雑な「置換」となると 想定の置換数と文字の長さで変わってくるんじゃないかな。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/09/16 23:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!