7

特定の文字またはフレーズを検索したい大きなテキスト ベクトルがあります。正規表現は永遠にかかります。どうすれば素早く検索できますか?

サンプルデータ:

R <- 10^7
garbage <- replicate( R, paste0(sample(c(letters[1:5]," "),10,replace=TRUE),collapse="") )
4

2 に答える 2

11

正規表現が必要な場合は、通常、PCRE ライブラリを使用することで ( を設定してperl=TRUE)、デフォルトの正規表現エンジンよりもパフォーマンスを向上させることができます。には、その他のパフォーマンスに関するヒントがあります?grep

パフォーマンスに関する考慮事項:

非常に長い文字列を含め、多数の正規表現マッチングを行う場合は、使用するオプションを検討する必要があります。通常、PCRE はデフォルトの正規表現エンジンよりも高速であり、'fixed = TRUE' はさらに高速です (特に、各パターンが数回しか一致しない場合)。

シングルバイト ロケールで作業していて、そのロケールで表現可能な UTF-8 文字列をマークしている場合は、最初にそれらを変換します。1 つの UTF-8 文字列だけで、すべての照合が Unicode で行われる必要があるためです。デフォルトの POSIX 1003.2 モードでは約 3 倍。

「useBytes = TRUE」を利用できる場合、文字列は照合前にチェックされず、実際の照合はより高速になります。多くの場合、UTF-8 ロケールではバイトベースのマッチングで十分です。これは、ある文字のバイト パターンが別の文字の一部と一致することはないためです。

于 2013-10-18T21:07:02.777 に答える
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
于 2013-10-18T20:42:23.670 に答える