如何加速R中的文本搜索?

Ari*_*man 6 optimization r

我有一个大文本向量我想搜索特定的字符或短语.正则表达式将永远存在.我该如何快速搜索?

样本数据:

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

Jos*_*ich 10

如果确实需要正则表达式,则通常可以通过使用PCRE库(通过设置perl=TRUE)获得比默认正则表达式引擎更高的性能.还有其他性能提示?grep:

性能考虑:

如果您正在进行大量正则表达式匹配(包括非常长的字符串),则需要考虑使用的选项.通常PCRE将比默认的正则表达式引擎更快,并且'fixed = TRUE'仍然更快(特别是当每个模式仅匹配几次时).

如果您正在使用单字节语言环境并且标记了在该语言环境中可表示的UTF-8字符串,请首先转换它们,因为只有一个UTF-8字符串将强制所有匹配都以Unicode完成,这会导致惩罚大约3倍的默认POSIX 1003.2模式.

如果你可以使用'useBytes = TRUE',匹配前不会检查字符串,实际匹配会更快.基于字节的匹配通常在UTF-8语言环境中就足够了,因为一个字符的字节模式永远不会与另一个字符的字节模式匹配.


Ari*_*man 6

这里不需要正则表达式,它们的功能带来了计算成本.

您可以使用参数关闭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
Run Code Online (Sandbox Code Playgroud)