2013-08-11 5 views
0

Я использую регулярное выражение для поиска очень специфического шаблона для каталога размером около 106 МБ. Это займет около 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]++"; 

При использовании притяжательных кванторов, движок регулярных выражений не регистрирует BACKTRACK позиции и не вернуться, чтобы попробовать другие возможности, если совпадение не найдено.

+0

Хм ... Я думаю, возможно это просто скорость, с которой он работает? Я сделал это изменение и не заметил разницы. –

+0

@inquisitor: можете ли вы привязать шаблон (начало строки, конец строки)? –

+0

Да, я могу закрепить его! –

1

Повторное составление шаблона регулярного выражения (для каждого файла) является относительно дорогостоящим отходом.

Вы можете определить это один раз и продолжать использовать один и тот же экземпляр.

+0

Я сделал это и не заметил никакой разницы в скорости: -/ –

Смежные вопросы