2017-02-03 1 views
0

У меня есть два файла input1.csv и input2.csv, размеры которых огромны.Альтернативные решения для синтаксического анализа Огромный файл

input1.csv имеет три столбца A, B и C (B уникален в этом файле).

input2.csv имеет 2 колонки B и C.

Я хочу, чтобы проверить, сколько раз каждый из B вхождение произошло в input2.csv файле.

Я реализовал, сохраняя значение B из файла input1.csv в arraylist и использовал hashmap с ключом как значение B и значение как B-появление в файле input2.csv. Эта логика работает нормально, но время выполнения увеличивается при увеличении размера файла. Также завершил код в основном методе. Есть ли другая логика для решения этой проблемы ??? Поскольку я новичок в 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. Если вам действительно нужно проверить, что значения из второго файла присутствуют в первом файле, вы должны создать вместо него набор и проверить на contains - но только при встрече с новым значением.
  • Вы получаете доступ к карте несколько раз (hashMap.get(val), затем hashMap.put(val, hashMap.get(val) + 1)). Просто сохранение hashMap.get(val) в переменной удалит один из доступных.
  • Использовать изменяемый AtomicInteger как значение. Вы можете избежать hashMap.put только incrementAndGet по значению.
  • С AtomicInteger вы можете просто hashMap.putIfAbsent(value, new AtomicInteger(0)).incrementAndGet().

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

  • Нет связанных вопросов^_^