2017-02-03 6 views
0

私はサイズが巨大なinput1.csvとinput2.csvの2つのファイルを持っています。代替ソリューション巨大なファイルを解析するため

input1.csvには、3つの列A、B、Cがあります(Bはこのファイルで一意です)。

input2.csvは2列BとC

私はBのそれぞれのoccuranceがinput2.csvファイルで発生した回数を確認したいがあります。

私はarraylistのinput1.csvファイルからBの値を格納して実装しました。また、input2.csvファイルのBの値としてBの値としてkeyを使用する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を使用することはありません。 2番目のファイルの値が最初のファイルに存在することを本当に確認する必要がある場合は、代わりにaを作成し、containsをチェックする必要があります。ただし、新しい値が発生した場合にのみチェックしてください。
  • あなたはマップに複数回アクセスします(hashMap.get(val)、次にhashMap.put(val, hashMap.get(val) + 1))。変数にhashMap.get(val)を保存するだけで、アクセスの1つが削除されます。
  • 可変値AtomicIntegerを値として使用してください。あなたは値でincrementAndGetだけhashMap.putを避けることができます。
  • AtomicIntegerとすると、ちょうどhashMap.putIfAbsent(value, new AtomicInteger(0)).incrementAndGet()になります。
関連する問題