multithreading zum Lesen einer Datei in Java
Ich bin erstellen von threads zu Lesen, eine Datei in java. Wenn ich 2 threads, jeder thread liest die gesamte Datei, während ich möchte, dass Sie Lesen Sie die verschiedenen Teile der Datei. Ich versucht, indem in sleep(), join(), yield (), aber nach der Aufnahme ist es nur zu verlangsamen das Lesen.
public class MyClass implements Runnable {
Thread thread;
public MyClass(int numOfThreads) {
for(int i=0;i < numOfThreads; i++) {
thread = new Thread(this);
thread.start();
}
}
public void run() {
readFile();
}
}
In readFile, in der while-Schleife(Lesen Zeile für Zeile), rief ich den sleep - ()/Ertrag(). Wie kann ich die threads Lesen, die verschiedenen Teile der Datei?
Aktualisiert mit Methode zum Lesen von Dateien...
public synchronized void readFile() {
try {
String str;
BufferedReader buf = new BufferedReader(new FileReader("read.txt");
while ((line = buf.readLine()) != null) {
String[] info = str.split(" ");
String first name = info[0];
String second name = info[1];
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
} catch (IOException e) {
System.out.println("Error : File not found");
e.printStackTrace();
}
}
- Wo ist der code, der die Datei liest?
- public synchronized void readFile() { try{ String str; BufferedReader buf = new BufferedReader(new FileReader("read.txt"); while((Zeile=buf.readLine())!=null) { String[] info = str.split(" "); String Vorname = info[0]; String Nachname = info[1]; try{ Thread.sleep(100); } catch(InterruptedException e) { } } catch(IOException e){ System.aus.println("Fehler : Datei nicht gefunden"); e.printStackTrace(); } }
- Sie können RandomAccessFile zu Lesen, an einer beliebigen position in einer Datei, aber es versteht nicht, "Linien". Zu finden Linien, müssen Sie Scannen Sie durch die gesamte Datei denn Zeilenumbrüche werden könnte, irgendwo in den Daten. Es sei denn, es ist strukturierter Daten.
- Was sind Sie eigentlich erreichen wollen mit diesem?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich nehme an, Sie denken, dass das Lesen einer Datei mit mehreren threads wie diese werden schneller als das Lesen mit einem. Dies ist fast sicher falsch. Threads besser auf Leistung, CPU-gebundene Aufgaben mit mehreren Kernen oder Prozessoren. Aber Lesen der Datei ist nicht eine CPU-gebundene Aufgabe.
Das OS verwendet den disk-controller Lesen von bytes auf die volle Bandbreite des disk-Schnittstelle. Für nahezu jede hardware-Kombination, die Geschwindigkeit ist begrenzt durch die Festplatte (Lesen und/oder mal suchen), seine Steuerung und seine DMA-Schnittstelle oder bus nicht von der CPU. Es ist einfach für eine CPU halten Sie die disk-controller 100% beschäftigt, auch mehrere Controller für verschiedene Festplatten. Wenn Sie brauchen, Beweis, starten, eine große Datei kopieren und beobachten Sie die CPU-Auslastung. Es wird nicht sehr hoch sein.
Daher von mehreren threads, nur eine zu einem Zeitpunkt ausgeführt, hinzufügen overhead, um einen single-threaded-Berechnung.
Was hat langsame Datei-transfers ist die Pufferung. Zu gewinnen Flexibilität, i/o-Bibliotheken können am Ende Pufferung jeder Charakter 2 oder sogar 3 mal.
Der Java-NIO-Bibliothek gemeint ist, zu tun, Weg mit, wie viel dieser Aufwand wie möglich. Siehe zum Beispiel dieser Artikel. Es gibt viele ähnliche. Meine Erfahrung ist, dass ein sorgfältig geschrieben NIO-reader verwenden die meisten der verfügbaren Leistung der hardware.
Gibt es eine Einschränkung: Wenn Sie eine schwere virus-checker set zu Scannen, die Art der Datei, die Sie Lesen, es könnte möglicherweise machen die Lektüre CPU-gebunden. In diesem ungewöhnlichen Fall, könnten Sie möglicherweise erhalten einen Schub von multi-threading in Abhängigkeit der Stein-Architektur. In diesem Fall würden Sie finden die gesamte Datei Größe S und lasst thread k=0,1,..,n-1, gelesen von offset-kS/n (k+1)S/n - 1 (durch
seek
ing, um den richtigen offset und tracking-Nummern der gelesenen bytes in jedem thread). Allerdings habe ich noch stark vermute, dass der zusätzliche Kopf-Suchzeit und andere Effekte von random access Abbrechen, jeden Vorteil zu laufen, den virus-checker in mehreren threads.In Ihrem Programm string.split(" ") können zu einer langsamen Laufzeit Geschwindigkeit. Sie schreiben es selbst , wird es verbessern Sie Ihre Geschwindigkeit von 6x.
So etwas wie dieses helfen:
Wenn Ihr system unterstützt high-throughput I/O , hier ist, wie Sie dies tun können:
So Lesen Sie eine Datei mit mehreren threads in Java, wenn ein hoher Durchsatz(3GB/s) Datei-system zur Verfügung