2013-08-11 4 views
0

저는 약 106MB 크기의 디렉토리에 대해 매우 구체적인 패턴을 검색하기 위해 정규 표현식을 사용하고 있습니다. 완료하는 데 약 10 초가 걸립니다.패턴 검색 성능이 좋지 않음

성능을 향상시킬 수있는 방법이 있습니까? 반복 (각 파일에 대한) 귀하의 정규식 패턴을 컴파일

package com.JFileReader; 

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class FileData { 

    public static void main(String[] args) { 
     File dir = new File("/Users/me/Desktop/"); 

     if(dir.isFile()) { handleFile(dir); } 
     if(dir.isDirectory()) { handleDir(dir); } 
    } 

    public static void handleFile(File aFile) { 
     String regex = "[a-zA-Z]+[.][a-zA-Z]+[@][a-zA-Z]+[.][a-zA-Z]+"; 
     Pattern pattern = Pattern.compile(regex); 

     try { 
      BufferedReader br = new BufferedReader(new FileReader(aFile)); 
      Matcher m; 

      String line; 
      while ((line = br.readLine()) != null) { 
       m = pattern.matcher(line); 
       if (m.find()) { 
        System.out.println("Found: " + aFile); 
       } 
      } 
      br.close(); 
     } catch (IOException ioe) { 
      ioe.printStackTrace(); 
     } 
    } 

    public static void handleDir(File dir) { 
     for (File file : dir.listFiles()) { 
      if(file.isFile()) { handleFile(file); } 
      if(file.isDirectory()) { handleDir(file); } 
     } 
    } 
} 
+0

패턴 검색의 경우 KMP 사용을 고려해야합니다. http://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm – Algorithmist

답변

2

당신은 소유 한정사를 사용할 수 있습니다 : 당신이 소유 한정사를 사용하면

String regex = "[a-zA-Z]++\\.[a-zA-Z][email protected][a-zA-Z]++\\.[a-zA-Z]++"; 

, 정규식 엔진은 경기가 실패 할 경우 다른 가능성을 시도 돌아가 결코 철수 위치를 기록하지하지 않습니다.

+0

음 ... 아마도 이 속도는 실행 속도에 불과합니다. 나는이 변화를 만들었고 차이를 느끼지 못했다. –

+0

@inquisitor : 패턴을 고정시킬 수 있습니까 (라인의 시작, 라인의 끝)? –

+0

네, 앵커 할 수 있어요! –

1

은 상대적으로 비용이 낭비이다.

한 번 정의하고 동일한 인스턴스를 계속 사용할 수 있습니다.

+0

나는 이것을했고 속도면에서 어떤 차이도 느끼지 못했다. -/ –