2013-10-18 1 views
4

큰 문자 벡터가있어서 특정 문자 나 문구를 검색하고 싶습니다. 정규 표현식은 영원히 계속되고 있습니다. 어떻게 빨리 검색합니까?R에서 텍스트 검색 속도를 높이려면 어떻게합니까?

샘플 데이터 :이 정규 표현식 필요가 여기에없고,

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

답변

7

. 다른 성능 팁 ?grep에 있습니다

성능 고려 사항 :

당신이 매우 긴 문자열을 포함하는 정규 표현식 매칭을 많이하고 있다면, 당신은 사용되는 옵션을 고려해야 할 것입니다. 일반적으로 PCRE는 기본 정규 표현식 엔진보다 빠르며 'fixed = TRUE'가 더 빠릅니다 (특히 각 패턴 이 몇 번 일치하는 경우).

먼저 변환 로 한 UTF-8 문자열이 에서 수행되는 모든 일치를 강제로 단일 바이트 로케일에서 작업하고 로케일로 표현할 수있는 UTF-8 문자열을 표시 한 경우 유니 코드는 기본 POSIX 1003.2 모드에서 약 3 배의 페널티를받습니다.

'useBytes = TRUE'를 사용할 수 있다면 일치하기 전에 문자열이 으로 확인되지 않으며 실제 일치가 빨라집니다. 종종 바이트 패턴은 의 바이트 패턴이 다른 문자의 일부와 일치하지 않으므로 UTF-8 로켈에서 바이트 기반 검색으로 충분합니다.

+0

차갑다. 아마도 반복 된 벡터가 많으면 잘 작동 할 수있는 요소가있는 트릭이 있습니다 .... –

5

그들의 힘은 계산 비용이 함께 제공됩니다.

,fixed=TRUE 인수를 사용하여 R의 정규식 함수에서 일반 표현식 구문 분석을 해제 할 수 있습니다. 속도 이익이 발생할 : 당신이 정규 표현식을해야하는 경우, 당신은 일반적으로 (perl=TRUE 설정에 의해) PCRE 라이브러리를 사용하여 기본 정규 표현식 엔진을 통해 성능 향상을 얻을 수 있습니다

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 
관련 문제