2012-06-20 3 views
0

로그가있는 두 개의 파일 (각각 거의 5000 줄)이 있습니다.HashTable에서 여러 검색을 빠르게하는 방법

Y#12#EMAIL_1#RULE_1,RULE_2,RULE_3,RULE_4#time=993470174 
Y#12#EMAIL_2#RULE_1,RULE_2,RULE_3,RULE_4#time=993470175 
Y#12#EMAIL_3#RULE_1,RULE_2,RULE_3#time=9934701778 

내가 파일을 읽고, 각 이메일에 대한 규칙을 얻기 위해 다음 함수를 사용합니다 :

private void processFile() 
    { 
      ArrayList<String[]> lSplitRules = new ArrayList<>(); 

     try { 
      FileInputStream fileStream = new FileInputStream("log.log"); 
      DataInputStream fileIn = new DataInputStream(fileStream); 
      BufferedReader fileBr = new BufferedReader(new InputStreamReader(fileIn)); 

      String strLine; 

      while ((strLine = fileBr.readLine()) != null) 
      { 
        String[] lTokens = strLineSpam.split("#"); 
        String lRawRules = lTokens[3]; 
        lSplitRules.add(lRawRules.split(",")); 
      } 


     } catch (FileNotFoundException e) { 
      System.out.println("File: log.log, not found. Error: " + e.getMessage()); 
     } catch (IOException e) { 
      System.out.println("Couldn't open log.log. Error: " + e.getMessage()); 
     } 

각 라인의 파일이 너무 좋아 관련된 일련의 규칙 이메일을 가지고 여태까지는 그런대로 잘됐다. ArrayList의 각 "space"에는 각 이메일에 대한 규칙을 포함하는 String []이 있습니다. 반면에 나는 또한 규칙의 하나 명의 고유 한 목록을 포함하는의 HashMap을 가지고 있고 그것은 다음과 같은 값입니다 :

RULE_NAME - VALUE 
RULE_1 - 0.1 
RULE_2 - 0.5 
RULE_3 - 0.6 
... 

나는 그것이 HashMap의에 있는지 너무보고 모든 이메일의 모든 규칙을 비교해야합니다. 나는 '이후,

private Double eval (String rule, Map<String, Double> scores) 
{ 

    for (Entry<String, Double> entry : scores.entrySet()) { 
     if (entry.getKey().equalsIgnoreCase(rule)) 
     { 
      return entry.getValue(); 
     } 
    } 

    return 0.0; 
} 

문제는 내가 모든 이메일을 비교할 필요가있다 그것은이다 (자세한 10.000 다음)를 여러 번 규칙 : 존재하는 어떤 계산을위한 규칙의 값을 반환하면 나는이 기능을 사용 각 규칙의 가치를 최적화하기 위해 유전자 알고리즘을 사용합니다. 어쨌든 HASHMAP을 통해 각 이메일의 규칙 비교를 최적화 할 수 있습니까? 나는 속도가 필요하므로 지금 8 분 안에 100 개의 검증을하고있다.

죄송합니다.

안부

답변

2

해시 테이블을 갖는 요점 너무 youc 인 단일 해시 룩업을 수행. 만약 당신이 단지 열쇠를 반복하려고한다면, List를 사용할 수도 있습니다.

scores을 어디에서 제작하는지 모르지만 사례를 정상화 할 수 있습니다. 케이스 insensive 조회

Double d= scores.get(key.toLowerCase()); 
위한

scores.put(key.toLowerCase(), value); 

관련 문제