Ich bin auf der Suche nach einer effizienten Möglichkeit zur Vorverarbeitung von CSV-Daten vor (oder während des) Dumps in einen Java-Stream.CSV-Daten effizient vor oder während parallelem Streaming verarbeiten
Unter normalen Umständen würde ich so etwas wie dies tun, um die Datei zu verarbeiten:
File input = new File("helloworld.csv");
InputStream is = new FileInputStream(input);
BufferedReader br = new BufferedReader(new InputStreamReader(is));
br.lines().parallel().forEach(line -> {
System.out.println(line);
});
jedoch in diesem aktuellen Fall ich Vorprozess müssen die Aufzeichnungen vor oder während sie Streaming und jedes Element in meiner Sammlung könnte davon abhängen, der Vorherige. Hier ist ein einfaches Beispiel CSV-Datei das Problem zu demonstrieren:
species, breed, name
dog, lab, molly
, greyhound, stella
, beagle, stanley
cat, siamese, toby
, persian, fluffy
In meinem Beispiel CSV die Art Spalte wird nur gefüllt, wenn es von den Rekord ändert aufzuzeichnen. Ich weiß, die einfache Antwort wäre, meine CSV-Ausgabe zu reparieren, aber in diesem Fall ist das nicht möglich.
Ich bin auf der Suche nach einem vernünftigen und effizienten Weg, die Datensätze von CSV zu verarbeiten, den Spezieswert aus dem vorherigen Datensatz zu kopieren, wenn er leer ist, und ihn nach der Vorverarbeitung in einen parallelen Stream zu übertragen.
Die Downstream-Verarbeitung kann lange dauern, so dass ich nach der Vorverarbeitung letztendlich parallel verarbeiten muss. Meine CSV-Dateien können auch groß sein, daher möchte ich vermeiden, dass zuerst die gesamte Datei in ein Objekt im Speicher geladen wird.
Ich hatte gehofft, es eine Möglichkeit, so etwas wie die folgenden (Warn schlecht Pseudo-Code) zu tun war:
parallelStream.startProcessing
while read line {
if (line.doesntHaveSpecies) {
line.setSpecies
}
parallelStream.add(line)
}
Meine aktuelle Lösung ist die gesamte Datei zu verarbeiten und zu „fixieren“ dann streamen. Da die Datei groß sein kann, wäre es schön, die Datensätze sofort nach der "Fixierung" und vor der Verarbeitung der gesamten Datei zu bearbeiten.
Ich dachte, ich würde diese Frage nehmen und das Wochenende mit einer benutzerdefinierten Antwort auf 'Spliterator', ich denke nicht mehr :) – Eugene
Wollen Sie den gleichen Nutzen für eine zeitaufwändige Operation sehen, die eine REST nicht unbedingt schwer rechnerisch (wie Schlagen ist Endpunkt)? –
Je nach E/A-Vorgang und Umgebung kann ein Vorteil angezeigt werden, aber die Stream-API verwendet eine Konfiguration, die auf die Berechnung zugeschnitten ist, dh die Ziel-Parallelität entspricht der Anzahl der CPU-Kerne, die für einen bestimmten Teil möglicherweise nicht die beste Wahl ist E/A-Betrieb. – Holger