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
}
}
}
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. –
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. –
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