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

时间:2013-10-18 20:42:24

标签: r optimization

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

示例数据:

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

2 个答案:

答案 0 :(得分:10)

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

  

效果考虑因素:

     

如果你正在做很多正则表达式匹配,包括on   很长的字符串,你会想要考虑使用的选项。   通常,PCRE将比默认正则表达式更快   引擎,'fixed = TRUE'仍然更快(特别是当每个模式   只匹配几次。

     

如果您使用的是单字节语言环境并且标记为UTF-8   在该语言环境中可表示的字符串,首先将它们转换为   只需一个UTF-8字符串就可以强制完成所有匹配   Unicode,默认POSIX吸引约3倍的惩罚   1003.2模式。

     

如果你可以使用'useBytes = TRUE',那么字符串将不会   匹配前检查,实际匹配会更快。经常   自字节模式以来,UTF-8语言环境中基于字节的匹配就足够了   一个角色永远不会与另一个角色相匹配。

答案 1 :(得分:6)

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

您可以使用,fixed=TRUE参数关闭R中任何正则表达式函数中的正则表达式解析。速度提升导致:

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