Ich habe große Textdatei, die Source-Target-Knoten und threshold.I speichert alle eindeutigen Knoten in HashSet, dann die Kanten basierend auf Benutzer-Schwellenwert filtern und die gefilterten Knoten in separated Hash Set.So möchte ich einen Weg finden, um die Verarbeitung so schnell wie möglich zu tun.Effizientes Lesen und Schreiben von großen Textdatei in Java
public class Simulator {
static HashSet<Integer> Alledgecount = new HashSet<>();
static HashSet<Integer> FilteredEdges = new HashSet<>();
static void process(BufferedReader reader,double userThres) throws IOException {
String line = null;
int l = 0;
BufferedWriter writer = new BufferedWriter(new FileWriter("C:/users/mario/desktop/edgeList.txt"));
while ((line = reader.readLine()) != null & l < 50_000_000) {
String[] intArr = line.split("\\s+");
checkDuplicate(Integer.parseInt(intArr[1]), Integer.parseInt(intArr[2]), Alledgecount);
double threshold = Double.parseDouble(intArr[3]);
if(threshold > userThres) {
writeToFile(intArr[1],intArr[2],writer);
checkDuplicate(Integer.parseInt(intArr[1]), Integer.parseInt(intArr[2]), FilteredEdges);
}
l++;
}
writer.close();
}
static void writeToFile(String param1,String param2,Writer writer) throws IOException {
writer.write(param1+","+param2);
writer.write("\r\n");
}
Die Grafik-Klasse tut BFS und schreibt die Knoten in getrennten file.I die Verarbeitung ohne getan haben einige Funktionalitäten und die Zeiten sind unten.
Timings mit 50 Millionen Zeilen liest in Prozess()
without calling BFS(),checkDuplicates,writeAllEdgesToFile() -> 54s
without calling BFS(),writeAllEdgesToFile() -> 50s
without calling writeAllEdgesToFile() -> 1min
Timings mit 300 Millionen Zeilen liest in Prozess()
without calling writeAllEdges() 5 min
Sie können Millionen von Zeilen pro Sekunde mit 'BufferedReader.readLine()' lesen. Das sollte ausreichen. Es gibt keinen Grund zu glauben, dass der Versuch, es zu multi-threading, es schneller machen wird. Die Festplatte ist nicht multi-threaded. – EJP
Wenn Sie Hilfe bei der Optimierung Ihres Codes haben möchten, wäre mein Ratschlag, nicht zu Multi-Threading zu springen, was höchstwahrscheinlich nicht die richtige Antwort ist (zumindest nicht die Art, wie Sie es tun, da alle Threads die gleiche Datei lesen und tun die gleiche Arbeit, auf den gleichen Daten). Stellen Sie Ihre Monothread-Lösung stattdessen bereit, ohne Schlüsselelemente wie checkDuplicate-Methoden zu entfernen und erklären Sie, was die Datei enthält und was der Prozess tun soll. –
ok ich habe Kommentare hinzugefügt. –