2017-02-03 1 views
0

크기가 큰 두 개의 파일 input1.csv 및 input2.csv가 있습니다.대체 솔루션 대용량 파일 구문 분석 용

input1.csv에는 3 개의 열 A, B 및 C가 있습니다 (B는이 파일에서 고유합니다).

input2.csv 2 열 B와 C

나는 B의 각 occurance가 input2.csv 파일에 발생 횟수를 확인 할 있습니다.

나는 arraylist의 input1.csv 파일에서 B 값을 저장하여 구현했으며 input2.csv 파일에서 B의 출현 값과 B 값으로 키를 사용하는 hashmap을 사용했습니다. 이 논리는 잘 작동하지만 파일 크기가 커질수록 실행 시간이 길어집니다. 또한 주 메서드 자체에서 코드를 완료했습니다. 이 문제를 해결할 다른 논리가 있습니까 ??? Java에 익숙하지 않으므로이 문제를 해결할 수있는 좋은 디자인 패턴을 제공 할 수 있습니까?

프로그램 :

import java.io.*; 
    import java.util.*; 
    public class Demo { 
    public static void main(String[] args) throws IOException{ 
     BufferedReader reader = null; 
     String encoding = "UTF-8"; 
     String comma = ","; 
     Map<String,Integer> hashMap = new HashMap<>(); 
     ArrayList<String> arrayList = new ArrayList<String>(); 

     reader = new BufferedReader(new InputStreamReader(new FileInputStream("input1.csv"), encoding)); 
     for (String line; (line = reader.readLine()) != null;) { 
      String val = line.split(comma)[1]; 
      arrayList.add(val); //Value to be later used 
      hashMap.put(val,0); 
     } 
      reader.close(); 
     reader = new BufferedReader(new InputStreamReader(new FileInputStream("input2.csv"), encoding)); 
     for (String line; (line = reader.readLine()) != null;) { 
      String val = line.substring(0,line.indexOf(",")); 
      if(hashMap.get(val) !=null) { 
       hashMap.put(val, hashMap.get(val) + 1); 
      } 
     } 
     reader.close(); 
     printMap(hashMap);  
    } 
    public static void printMap(Map mp) { 
     Iterator it = mp.entrySet().iterator(); 
     while (it.hasNext()) { 
      Map.Entry pair = (Map.Entry)it.next(); 
      System.out.println(pair.getKey() + " = " + pair.getValue()); 
      it.remove(); // avoids a ConcurrentModificationException 
     } 
    } 
} 
+0

설명에 따르면 훌륭한 해결책 인 것 같습니다. 해시지도에서 값을 확인/증가하는 경우 큰 감속을 경험해서는 안됩니다. 해시지도는 O (1) 상각됩니다. 코드를 게시해야합니다. 핵심 알고리즘과 관련이없는 코딩 문제가 있다고 생각합니다. – lexicore

+0

안녕하세요 @lexicore가 내 코드를 업데이트했습니다. – RAGA

답변

0

귀하의 코드가 더 많거나 적은 괜찮습니다. 나는 당신이 훨씬 더 최적으로 할 수 있다고 생각하지 않습니다.

몇 가지 코멘트 :

  • 당신은 실제로 arrayList를 사용하지 않습니다. 두 번째 파일의 값이 첫 번째 파일에 있는지 확인해야하는 경우 대신 a를 만들어야하고 contains을 확인해야합니다. 그러나 새 값을 만났을 때만 확인하십시오.
  • 지도에 여러 번 액세스하십시오 (hashMap.get(val), hashMap.put(val, hashMap.get(val) + 1)). 변수에 hashMap.get(val)을 저장하기 만하면 액세스 중 하나가 제거됩니다.
  • 가변 값 AtomicInteger을 값으로 사용하십시오. 값에 incrementAndGet 만 입력하면 hashMap.put을 피할 수 있습니다.
  • AtomicInteger을 사용하면 hashMap.putIfAbsent(value, new AtomicInteger(0)).incrementAndGet() 일 수 있습니다.