2016-09-16 1 views
0

私はSpringバッチフレームワークにはかなり新しいです。バッチマルチスレッドItemWriter

現在、読者とライターでバッチを書いています。

リーダはDbから読み取りを行い、ライターはフラットファイルに書き込みます。レコード数は100万です。ファイルへの書き込みには多くの時間がかかり、その点を改善したい。

write()メソッドが並行して実行されるように、私はライターでマルチスレッド化を達成する最良の方法は何ですか?

注:@BeforeStep@AfterStepコールバックでは、ファイルのヘッダーとフッターを作成しています。 write()メソッドはレコードをファイルに書き込みます。

EDIT:

は、ファイルへの書き込みには多くの時間を取っていないが、暗号解読のいくつかの並べ替えを行い、当社の内部方法の一つは、1つのレコードの500msのほどかかります、という私を発見しました。そして、私たちは100万のそのような記録を持っています。

複数のスレッドで復号化を実行してパフォーマンスを向上させることはできますか?私はここから改善する方法を理解することができません。

+0

時間がかかりますか?この種のことは通常I/Oバインドであり、複数のスレッドは役に立ちません。 – chrylis

+0

時間を見れば100万レコードになるとファイルに書き込むのに時間がかかります。私は、並列スレッドでファイルを書き込むと時間をかけて改善することを望んでいました。 – Miral

+0

複数のスレッドがプロセスをより速くすることを意味するわけではありません。 –

答えて

0

これは実際にはSpring固有の質問ではありません。通常、人々は何らかの種類のストリーミングを実装します。あなたはクエリ全体を読まずにすべてを書いていくのではなく、ちょっとずつ少しずつ読んでから、各ビットをライターに渡して読書を終える前にすでに書込みを始めることができます。これは速く、多くのメモリを使用することもできません。たとえば、10GBのデータを読み書きする場合は、10GB全体を読み込む代わりに、10MBのクエリに分割することができます。ストリームを読み上げる必要があります。ただし、同じファイルへの並列書き込みでは、メリットが得られず、パフォーマンスが低下します。あまりにも多くのスレッドを開始しないように注意する必要があります。これもパフォーマンスを低下させ、スレッドが本当に安価でない限り、実際には2以上のスレッドを作成することはお勧めしません。 Oバインドされており、スレッドをブロックしないバッファリング/ストリーミング/キャッシングによる影響を緩和するだけでなく、アプリで何かできることもあります。