CSVデータをJavaストリームにダンプする前に効率的にCSVデータを前処理する方法を探しています。通常の状況下ではCSVデータを並列ストリーミング前またはストリーミング前に効率的に前処理する
私は、ファイルを処理するために、このような何かをするだろう。それらをストリーミングし、私のコレクション内の各項目が依存する可能性がありながら、私は、レコードの前または前処理する必要がある。この現在のケースではしかし
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);
});
を以前。ここでは、問題を実証するための簡単な例であるCSVファイル:それはレコードからレコードを変更したときに私の例CSVで
species, breed, name
dog, lab, molly
, greyhound, stella
, beagle, stanley
cat, siamese, toby
, persian, fluffy
種の欄にのみ移入されます。私は単純な答えが私のCSV出力を修正することであることを知っているが、この場合は不可能です。
私はCSVからレコードを処理し、前のレコードの種別値を空白にしてコピーし、前処理後にパラレルストリームに渡すという合理的で効率的な方法を探しています。
ダウンストリーム処理には長い時間がかかるため、最終的には前処理が完了すると同時に処理する必要があります。私のCSVファイルも大きくすることができますので、まずファイル全体をメモリ内のオブジェクトにロードしないようにします。
私はを以下(警告悪い擬似コード)のような何かをするいくつかの方法があった期待していた。
parallelStream.startProcessing
while read line {
if (line.doesntHaveSpecies) {
line.setSpecies
}
parallelStream.add(line)
}
私の現在のソリューションは、ファイル全体を処理し、それをストリーム「それは修正する」ことです。ファイルが大きくなる可能性があるので、レコードが「固定」され、ファイル全体が処理される直前にレコードの処理を開始するとよいでしょう。
私はこの質問と答えを週末にかけてカスタムSpliteratorで取ると思っていました。 – Eugene
時間のかかる操作では必ずしも計算上重大ではない(例えばREST終点)? –
I/O操作と環境によっては、利点があるかもしれませんが、Stream APIは計算に合わせた構成を使用します。つまり、CPUコアの数に一致するターゲット並行性を使用します。 I/O操作。 – Holger