2013-10-18 31 views
4

我有一個大的文本向量,我想搜索特定的字符或短語。正則表達式正在走向永恆。我如何快速搜索它?如何加快R中的文本搜索速度?

的樣本數據:

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

回答

7

如果你確實需要的正則表達式,通常可以通過使用PCRE庫(通過設置perl=TRUE)得到了默認的正則表達式引擎的性能提升。還有其他的性能提示在?grep

性能方面的考慮:

如果你正在做大量的正則表達式匹配的,包括 很長的字符串,你將要考慮使用的選項。 通常,PCRE將比默認正則表達式 引擎更快,'fixed = TRUE'更快(尤其是當每個模式 僅匹配幾次時)。

如果您在單字節語言環境工作,並具有顯着的UTF-8 字符串,在該區域設置有表示的,將它們轉換首先是作爲 只是一個UTF-8字符串將迫使 做的所有匹配Unicode,對於默認的POSIX 1003.2模式,其處罰約爲3倍。

如果您可以使用'useBytes = TRUE',那麼匹配前將檢查字符串 ,實際匹配會更快。 基於字節的匹配在UTF-8語言環境中通常是足夠的,因爲 一個字符的字節模式永遠不會匹配另一個字符的一部分。

+0

很酷。如果你有很多重複的載體,大概有一些技巧可以起作用。 –

5

沒有必要對正則表達式在這裏,他們的動力配備了計算成本。

您可以使用,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