2010-11-26 2 views
1

두 개의 열 (pattern 및 neworder)과 cca 100 개의 행 (모두 다른 패턴)을 포함하는 데이터 테이블이 있습니다.루프 내 Regex 클래스의 성능 문제

입력 문자열을 패턴 (그룹화 된 일치)과 일치시키고, 일치가 발생하면 Regex.Replace 명령을 사용하여 검색된 그룹을 재정렬하려고합니다.

사실, Regex는 루프 내에서 사용될 때 매우 친절하지 않습니다. 입력 문자열을 하나 이상의 패턴과 일치시켜야하고 출력 문자열의 모양을 재정렬해야하기 때문에이 작업을 완료하는 유일한 방법은 Regex 클래스를 사용하는 것입니다. 그러나 그것은 성능을 크게 떨어 뜨리기 때문에 적절한 해결책으로 보이지 않습니다.

코드는 일치하는 작업을 수행 할 정적 메소드를 사용하는 경우 자동으로이

DataTable dt = this.GetPatterns(); 
DataRow dr; 
System.Collections.IEnumerator ie = dt.Rows.GetEnumerator(); 
while(ie.MoveNext() && !found) 
{ 
    dr = ((DataRow)ie.Current); 
    pattern = dr["pattern"].ToString(); 
    neworder= dr["neworder"].ToString(); 

    Regex reg = new Regex(pattern, RegexOptions.IgnoreCase); 
    Match match = reg.Match(input_string); 

    if (match.Success) 
    { 
    found = true; 
    output = reg.Replace(input_string, neworder); 
    } 

} 

답변

4

같은 .NET 보이는 컴파일 된 정규식 당신을 위해 객체를 캐시합니다.

if (Regex.Match(input, pattern, options).Success) 
{ 
    output = Regex.Replace(input, pattern, neworder, options); 
} 

그것은 단지 기본적으로 15 개 가장 최근에 사용 된 객체를 캐시, 그래서 당신은 Regex.CacheSize 속성을 조정하여 그 증가 할 것이다.

+0

아니요, 귀하의 제안은 의미가 있지만 작동하지 않습니다. Regex.CacheSize = 200을 추가했지만 같은 문제가 발생했습니다. Regex 객체의 배열을 만들려고했기 때문에 같은 객체를 다시 재사용 할 필요가 없지만 도움이되지 않습니다. – mko

+1

'if (Match) '단계가 중복되는 것이 사실입니다. 왜냐하면 그것은 효과적으로'Replace' 메소드가하는 첫 번째 일이기 때문입니다. 하지만 그 단계를 제거하고 성능을 여전히 받아 들일 수없는 경우 정규식을 개별적으로 조정하거나 앱을 다시 디자인해야합니다. –