特定の文字またはフレーズを検索したい大きなテキスト ベクトルがあります。正規表現は永遠にかかります。どうすれば素早く検索できますか?
サンプルデータ:
R <- 10^7
garbage <- replicate( R, paste0(sample(c(letters[1:5]," "),10,replace=TRUE),collapse="") )
特定の文字またはフレーズを検索したい大きなテキスト ベクトルがあります。正規表現は永遠にかかります。どうすれば素早く検索できますか?
サンプルデータ:
R <- 10^7
garbage <- replicate( R, paste0(sample(c(letters[1:5]," "),10,replace=TRUE),collapse="") )
正規表現が必要な場合は、通常、PCRE ライブラリを使用することで ( を設定してperl=TRUE
)、デフォルトの正規表現エンジンよりもパフォーマンスを向上させることができます。には、その他のパフォーマンスに関するヒントがあります?grep
。
パフォーマンスに関する考慮事項:
非常に長い文字列を含め、多数の正規表現マッチングを行う場合は、使用するオプションを検討する必要があります。通常、PCRE はデフォルトの正規表現エンジンよりも高速であり、'fixed = TRUE' はさらに高速です (特に、各パターンが数回しか一致しない場合)。
シングルバイト ロケールで作業していて、そのロケールで表現可能な UTF-8 文字列をマークしている場合は、最初にそれらを変換します。1 つの UTF-8 文字列だけで、すべての照合が Unicode で行われる必要があるためです。デフォルトの POSIX 1003.2 モードでは約 3 倍。
「useBytes = TRUE」を利用できる場合、文字列は照合前にチェックされず、実際の照合はより高速になります。多くの場合、UTF-8 ロケールではバイトベースのマッチングで十分です。これは、ある文字のバイト パターンが別の文字の一部と一致することはないためです。
ここでは正規表現は必要ありません。正規表現の威力には計算コストが伴います。
引数を使用して、R の任意の正規表現関数で正規表現の解析を無効にすることができ,fixed=TRUE
ます。速度向上の結果:
library(microbenchmark)
m <- microbenchmark(
grep( " ", garbage, fixed=TRUE ),
grep( " ", garbage )
)
m
Unit: milliseconds
expr min lq median uq max neval
grep(" ", garbage, fixed = TRUE) 491.5634 497.1309 499.109 503.3009 1128.643 100
grep(" ", garbage) 1786.8500 1801.9837 1810.294 1825.2755 3620.346 100