1行につき40文字前後で(固定長ではない)、1ファイルにつき約1億行書かれたファイル(1ファイルにつき3-5GB程度のテキストファイル)が30ファイルあります。ファイルは、すべてアルファベットで構成されていていますが、スペースは含まれておらず、各行の末端は改行(\n)で区切られています。これらのファイルからある特定の文字に完全にマッチする部分が含まれる行が各ファイルごとに何行あるのかを調べたいと思っています。検索する文字列の長さは10-20文字のものをいろいろと調べたいと思っています。
この作業をperlで行う場合、index関数を使って検索をするのと、正規表現を使って検索をするのでは、どちらが早いのでしょうか?もしくは、他に良い方法やmoduleがあるようでしたら教えてください。
よろしくお願いします。
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% --
回答ありがとうございます。
疑問が解決しました。
indexの方が早いとは予測していたのですが、思っていたほど違いはないんですね。これだったら、より柔軟に文字列を設定できる正規表現を使おうかと思います。
ありがとうございました。
No.4
- 回答日時:
ちょっと気になったので、追記しておきます。
index関数との比較ということで、固定された検索ワードと理解しています。
従って、私の取ったベンチは、$str =~ /hoge/のようなリテラルでのパターンマッチ速度です。
正規表現というのは本来 /^[a-fA-F]{4}\d{2,10}.+$/のようなもので、
単純に$str =~ /h.{2}e/としただけでも、indexの方が早くなってきます。
補足の説明をありがとうございます。
今回の解析では、固定された検索ワードで検索するだけでしたので、ANo.2の回答で問題ありません。
気遣いありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- フリーソフト テキストファイル内を検索したい 1 2022/06/01 08:33
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- ドライブ・ストレージ Windows10でのファイル内の文字列検索 SSDに寿命? 4 2022/07/12 03:25
- その他(コンピューター・テクノロジー) Power Shellコマンドで作成日時を一括シフトする方法 3 2022/10/21 12:37
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
- Visual Basic(VBA) vbaサブフォルダーをワイルドカードで取得したい 2 2022/11/15 08:04
- その他(ソフトウェア) 一太郎付属の”全件検索”ツールの不具合 3 2023/07/25 15:03
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:12
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
.NETアプリを作ったときの .man...
-
アクセス 壊れた? 「ファイ...
-
コマンドプロンプトで作成日時...
-
binファイルを解凍したいの...
-
C言語---ファイルに出力したデ...
-
リンクの張り付けかたを教えて...
-
【VBS】 iniファイルの特定部...
-
既にファイルが開いているのな...
-
#include <Windows.h>というヘ...
-
VC++でファイル比較の方法
-
ゲームの中身を見てみたい
-
Eclipseによるテンプレートの作...
-
コマンドプロンプトで、指定し...
-
参照するファイルをワイルドカ...
-
ファイルが開かれているかどう...
-
bibtexで参考文献作成できない
-
エクセルファイルが複数同時に...
-
CSVから指定行だけを読み込み
-
「FindFirstFile」APIで、検索...
-
GetOpenFilename メソッドについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
アクセス 壊れた? 「ファイ...
-
#include <Windows.h>というヘ...
-
Latexで図番号だけを「図1.1」...
-
binファイルを解凍したいの...
-
.NETアプリを作ったときの .man...
-
ファイル構造が破損しているフ...
-
2つのファイルのバイナリをコン...
-
CSSを1ページに1枚作るのって変...
-
Word VBA MSGBOX 内で降順表示
-
公文書のxmlファイルの開き方が...
-
jarファイル
-
バッチ処理で追記コピーしたい
-
自分で作成した重要ファイルを...
-
ファイルは何で構成されている...
-
exeファイルをデータ転送サービ...
-
リンクの張り付けかたを教えて...
-
exeファイルの中身を見る方法は...
-
参照するファイルをワイルドカ...
-
CRCが一致する確率
-
C言語---ファイルに出力したデ...
おすすめ情報