2017-02-03 3 views
0

Ich habe zwei Dateien input1.csv und input2.csv, deren Größe sehr groß sind.Alternative Lösungen zum Analysieren riesige Datei

input1.csv hat drei Spalten A, B und C (B ist in dieser Datei eindeutig).

input2.csv hat 2 Spalten B und C.

ich überprüfen möchten, wie oft jedes Vorkommen von B in input2.csv Datei aufgetreten ist.

Ich habe durch Speichern von Wert B aus der Datei input1.csv in der Arraylist implementiert und verwendet hashmap mit Schlüssel als B's Wert und Wert als B's Vorkommen in der Datei input2.csv. Diese Logik funktioniert gut, aber die Ausführungszeit erhöht sich, wenn die Dateigröße zunimmt. Auch haben Sie den Code in der Hauptmethode selbst abgeschlossen. Gibt es eine andere Logik, um dieses Problem zu lösen? Da ich neu in Java bin, kann mir jemand ein gutes Designmuster für dieses Problem zur Verfügung stellen?

Programm:

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

Aus Ihrer Beschreibung scheint es eine gute Lösung zu sein. Wenn Sie nur Werte in der Hash-Karte überprüfen/erhöhen, sollten Sie keine größere Verzögerung erfahren, Hash-Karten sind amortisiert. Sie sollten Ihren Code posten, ich glaube, Sie haben einige Codierungsprobleme, die nicht mit dem Kernalgorithmus zusammenhängen. – lexicore

+0

Hallo @lexicore haben meinen Code aktualisiert. – RAGA

Antwort

0

Ihr Code ist mehr oder weniger in Ordnung. Ich glaube nicht, dass du es viel besser machen kannst.

Einige Kommentare:

  • Sie nie arrayList tatsächlich nutzen. Wenn Sie wirklich überprüfen müssen, ob die Werte aus der zweiten Datei in der ersten Datei vorhanden sind, sollten Sie stattdessen eine HAS-Datei erstellen und nach contains suchen - aber nur, wenn ein neuer Wert gefunden wird.
  • Sie greifen mehrmals auf die Karte zu (hashMap.get(val), dann hashMap.put(val, hashMap.get(val) + 1)). Ein einfaches Speichern von hashMap.get(val) in einer Variablen würde einen der Zugriffe entfernen.
  • Verwenden Sie veränderbare AtomicInteger als Wert. Sie könnten hashMap.put durch nur incrementAndGet auf dem Wert vermeiden.
  • Mit AtomicInteger könnten Sie nur hashMap.putIfAbsent(value, new AtomicInteger(0)).incrementAndGet().
Verwandte Themen