2016-03-24 3 views
0

Ich müsste eine Datei auf effiziente Weise lesen.Wie liest man aus verschiedenen Abschnitten einer Datei mit mehreren Threads in Java und wird es effizient sein?

Ich würde die Datei lesen und jedes Wort aus der gelesenen Datei würde in benutzerdefinierte Wörterbuch untersucht und den Offset des Wortes in der Datei entscheiden.

Ich kam mit der folgenden Lösung bis zum

Produzenten Gewinde

Liest Zeile für Zeile aus der Datei und legt jede Zeile ConcurrentHashMap.

Verbraucher Themen

Liest die Linie von Karte und sucht das Wort ins Wörterbuch auf.

Ich bin ziemlich sicher über die Implementierung des Verbrauchers, aber nicht sicher, ob die Verwendung von Threads zum Lesen der Datei hilfreich wäre. Ungewiss Java IO oder Java NIO

Aktualisiert Beispielcode zum Lesen von Datei-Update für Hersteller zur Karte

public class DocumentManager { 


    Map<Location, String> map = null; 


    public DocumentManager(Map<Location, String> map) { 
     this.map = map; 
    } 

    public void readFile(String path) throws IOException{ 
     BufferedReader bufferedReader = new BufferedReader(new FileReader(new File(path))); 

     String line = ""; 

     while((line = bufferedReader.readLine()) != null){ 
      map.put(new Location(0, 0), line); 
      //location is dummy at the moment 
     } 
    } 

} 
+1

Was meinen Sie mit "effizient"? Ein Multithread-Programm ist _always_ immer weniger effizient als ein Singlethread-Programm, wenn "effizient" bedeutet, die CPU-Zyklen bestmöglich zu nutzen. Ein Multithread-Programm, das auf einem Multi-Prozessor-Host läuft, kann jedoch effizienter sein als ein Single-Thread-Programm. Thread-Programm, wenn "effizient" bedeutet, dass der Job mit der geringsten Menge an Echtzeit erledigt wird. –

+1

Datei-E/A ist oft ein Engpass. Wie groß der Engpass ist, hängt von der Art des Dateisystems ab. Wenn Sie von einer klassischen (d. H. Rotierenden) Festplatte sprechen, spielt es keine Rolle, wie viele CPUs verfügbar sind, um Ihren Code auszuführen, wenn das Laufwerk nur über ein Kopf-Array verfügt. Selbst wenn es ein Solid-State-Laufwerk ist, ist es mit dem Host über eine Schnittstelle verbunden, und wenn Ihr Programm Daten so schnell verarbeiten kann, wie es über die Schnittstelle gezogen werden kann, gibt es keine Möglichkeit mehr Threads hinzuzufügen schneller. Manchmal ist der beste Weg, es herauszufinden, indem Sie es versuchen. –

+0

Es ist im Grunde sinnlos. Die Festplatte ist nicht Multithread. Die Zeiten von Fixed-Multi-Head-Festplatten sind Jahrzehnte zurück. Sie können Millionen von Zeilen pro Sekunde mit einem 'BufferedReader' lesen. Wenn das nicht genug ist, ist nichts. – EJP

Antwort

0

Die Verwendung von Threads ist nicht frei und das Übergeben eines Objekts zwischen Threads über eine blockierende Warteschlange kann überraschend teuer sein. Das Aktualisieren einer Map ist zwar nicht kostenlos, aber viel billiger als das Übergeben von Arbeit zwischen Threads.

Wahrscheinlich verbringen Sie die meiste Zeit damit, die Datei zu lesen und zu analysieren. Wenn Sie eine Textdatei haben, ist es sehr schwierig, dies mit mehreren Threads zu tun, und noch schwieriger, es schneller zu machen, als nur in einem Thread zu lesen.

+0

Ok. Nehmen wir an, ein Thread liest eine Zeile nach der anderen in ConcurrentHashMap und die Verbraucher würden von der Karte lesen. Ich denke, das könnte Trick tun –

+1

@ChannammaVadigeri was würden die Verbraucher tun, dass der Produzent nicht tun kann? Sie können die Karte einfach mit dem gewünschten Ergebnis aktualisieren. –

+0

was ich dachte, ist readLine in bufferedReader Klasse würde blockieren, bis eine Zeile gelesen wird, dachte ich, ich kann diese Zeit der CPU nutzen, um in anderen Thread zu verarbeiten. Ich bin ziemlich neu in Java, also entschuldige bitte, wenn ich irgendwelche falschen Aussagen gemacht habe. Nur Aktualisierung mit dem Beispielcode, der in meinen Gedanken ist –

0

Sie können RandomAccessFile lesen verschiedene in jedem Thread verwenden Abschnitte der Datei zu verwenden. Mit RandomAccessFile können Sie Bytes beginnend mit dem Dateizeiger lesen und den Dateizeiger über die gelesenen Bytes hinaus weiterleiten.

+0

Ist das eine Antwort oder ein Kommentar? –

+1

Sie müssten sicherstellen, dass Sie ein ganzes Wort lesen, auch wenn Sie zufällig beginnen. Sie müssen auch sicherstellen, dass Sie eine lokale Kopie der Zählung aktualisieren und erst am Ende zusammenführen, aber es könnte getan werden. –

Verwandte Themen