2010-03-30 2 views
1

1.12 GB 디렉터리의 모든 로그 파일에 유닉스 regEXP를 실행하려고 다음 '' 일치하는 패턴을 바꿉니다. 4 메가 파일에 대한 테스트 실행에는 약 10 분이 걸렸지 만 작동했습니다. 분명히 무언가가 몇 가지 등급의 성능을 저해합니다.UNIX 스타일의 RegExp Replace는 Windows에서 매우 느리게 실행됩니다. 도움? 편집 : 부정적 lookahead 어설 션 성능에 영향을

업데이트 : 77 개의 일치 항목이있는 5.6MB 파일에서^(155 [0-2]). * 검색에 약 7 초가 소요됩니다. regExp가^(?! 155 [0-2]). * $가되어 적어도 5-10 분이 걸릴 수 있도록 Negative Lookahead Assertion,?을 추가하십시오. 수천 가지의 성냥이있을 것입니다.

일치하는 항목이 많을 때 부정적인 미리 단정 표시가 성능에 매우 나쁜 영향을 미치지 않습니까?

+0

모든'. * '의 사용법은 무엇입니까? – kennytm

+0

사용하고 있습니다.* 임의의 문자가 0 번 이상 나오는 것을 나타냅니다. 기본적으로 "숫자 문자열 앞뒤에있는 모든 텍스트를 가져옵니다"라고 말하면 달러 기호 (행의 끝과 일치) 앞의 문자 하나를 제거하지만, 그것이 내 성능 병목이라고 생각해 ... –

+0

정규 표현식은 155이지만 텍스트에 152라고 표시되어 있습니다. 오타가 맞지 않거나 잘못된 정규식을 실행하고 있습니까? – Kip

답변

0

처음에 그 .*을 제거 할 수 있다면 도움이 될 것입니다. 그 전에는 무엇이 될 수 있는가, 그냥 공백인가? 그렇다면, 시도 :

^(?!\s*155[0-2][0-9]{4}\s).*$ 

그것은 정말 아무것도 할 수없는 경우, 비 욕심 시도해보십시오 :

^(?!.*?155[0-2][0-9]{4}\s).*$ 

참고 : 두 예제에서, 나는 두 번째 .*을 제거하기 때문에 세 번째는 것 똑같은 것이 일치합니다.

정규식 엔진이 실제로 수행 할 작업을 생각하는 데 도움이됩니다.

  1. 일치 ^ (라인의 시작). 문제 없어.
  2. 음수 미리보기 어설 션을 일치 시키십시오.
  3. .*으로 가능한 한 많이 잡으십시오. 이것은 전체 라인을 점유한다는 것을 의미합니다.
  4. 다음 문자는 1입니까? 그렇지 않은 경우 .*을 하나 적은 문자와 일치시키고 1과 일치 할 때까지 반복합니다.

이것은 일치하지 않는 모든 행에 대해 전체 행을 역 추적한다는 것을 알 수 있습니다. 자, 처음에 \s*을 사용하면 공백 만 남기고 전체 행은 아닙니다. 실제로 무엇이든 될 수 있다면 패턴은 155 패턴과 일치하는 라인에서 빠를 것이며, 그렇지 않은 라인에서는 거의 동일합니다. 지금 사용하고있는 정규식 구현은 비선형 만 일반의 부분 집합을 처리 할 수 ​​있습니다 기본적으로

+0

흥미 롭습니다 ... 귀하의 제안 외에도, (내 로그 파일의 형식에 따라) 그룹화에서 [0-9] {4} \ s을 (를) 제거 할 수 있다고 생각합니다. 그게 많이 도움이 되나요? 현재^(?! \ s * 155 [0-2]). * $를 시도하고 있지만 여전히 매우 느립니다. : –

+0

@ JohnSullivan : 아마 그다지 많지 않습니다. 길이가 고정되어 있기 때문에 궁극적 인 이유는 프로그램이 전체 로그 파일을 메모리에로드하고 정규식을 실행 한 다음 파일을 작성한다는 것입니다. 한 번에 한 줄씩 처리하는 것과는 대조적으로) – Kip

+1

네거티브 미리보기 연산자 인!!가 있으면 성능이 현저하게 떨어지는 것으로 나타났습니다 (5mb에서 7 초에서 10 분, 7000 번 대 20000). 정규식이 아니라 프로그램을 비난해야한다고 생각하십니까? –

0

을 (. 그것은 전체 라인을 잡고 때까지 일치하지 않는 선에서, 그것은 .* 성장 계속됩니다) 어떤 효율성으로 표현 언어. 더 많은 배경에 대해 regex implementation that can handle machine generated regexes에 대한 내 질문을 효율적으로보십시오.

다른 구현을 선택할 수 있다면 운이 좋을 것입니다. 내가 이것을보고있을 때 등은 드물었다. 두 가지 합리적인 옵션은 RE2TRE이지만 둘 다 독립 실행 형 파일이 아닌 라이브러리입니다.

또 다른 옵션은 과거에 사용했던 유닉스 유틸리티 (grep?)를 사용하는 것입니다. grep은 다른 많은 유닉스 유틸리티처럼 윈도우 포트를 가지고 있습니다.

관련 문제