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 字符串,请首先将它们转换为只有一个 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 回答