Ich habe ein Problem, wo dieser Code nicht den gleichen Wert jedes Mal zurückgibt, wenn es ausgeführt wird. Ich nehme an, es liegt daran, dass es nicht threadsicher ist und ich Parallelitätsprobleme mit Parallelität() habe. Ich habe versucht, einen Spliterator zu verwenden, und das funktioniert, aber Laufzeit, weil 3 Mal schlechter, das gleiche wie sequential. Wie sonst kann ich das tun?Parallelitätsprobleme mit parallel()
Ps: traverseDirectory gibt eine BlockingQueue aller TXT-Dateien in einem Verzeichnis zurück.
try {
pq = traverseDirectory(dir, pq);
while(!pq.isEmpty()){
File f = pq.take();
LineNumberReader lr = new LineNumberReader(new FileReader(f));
lr.lines()
.parallel()
.forEach((line) -> {
String[] words = line.split("\\s+");
for(String word : words){
wordList.add(word);
}
}); // foreach
} // while
} //try
catch (IOException | InterruptedException e) {}
System.out.println("size: " + wordList.size());
EDIT ich vergaß zu erwähnen, dass ich den Überblick behalten müssen in welcher Zeile das Wort gefunden wurde!
Korrekt, aber Sie können stattdessen '.flatMap (Pattern.compile (" \\ s + ") :: splitAsStream)' stattdessen verwenden. Es stellt sicher, dass das Regex-Muster genau einmal statt für jede Zeile geparst wird, und es wird kein Zwischenfeld für jede Zeile gefüllt. – Holger
@Holger 'splitAsStream' ist ein neues für mich. Du hast meinen Tag gerettet. –
@Holger Was genau macht flatMap? – yeahboy