5

データベースから読み取り、結果をファイルに書き込むシリアルプログラムを変更しようとしています。これはブロック方法で行われ、メモリバッファーがあり、ファイルが書き込まれることでパフォーマンスが向上すると思います。 「バックグラウンド」は非同期的に

スレッド、共有リソース、同期ブロックなどを使用した「就職の面接」ソリューションを考えることができますが、もっと良い方法があると確信しています(それを実行する素敵な「遅延書き込み」ライブラリがありますか?私のため?)

java.util.concurrentパッケージのいずれかが助けになりますか?java.nio?またはおそらくJMS/ActiveMQ?

私のバッファの基礎としてのPipedOutputStream/はどうですか?PipedInputStream

Javaで遅延/バックグラウンド/バッファリング/非ブロッキング/非同期ファイルライターを実装するにはどうすればよいですか?

編集:

提案に基づいて、そしてこの質問が閉じられるのを避けるために(私はそれが回答のコメントと投票に基づいてまだ関連していると思うので)ここにそれをより焦点を合わせる試みがあります。(私は上記の元の質問を保持しているので、いくつかの非常に良い質問があるので、答えはまだ文脈に残ります)

  • PipedOutputStream/ PipedInputStream(またはPipedReader/ PipedWriter)との実際的な違いは何ですかBlockingQueue
  • 非同期ファイルの書き込みには後者を使用するのが望ましいですか?(または、このリンゴとオレンジの比較ですか?もしそうなら、理由を知りたいですか?)
4

3 に答える 3

5

おそらく、プロデューサ (データベース リーダー) とコンシューマ (ファイル ライター) の間で制限付きブロッキング キューを使用することをお勧めします。

Java のArrayBlockingQueueは、非常にうまく機能します。プロデューサーは、バッファーがいっぱいになるとブロックし、大量のメモリを消費する問題を回避します。

プロデュースとコンカレント スレッドでのコンシュームは、Java のExecutorsフレームワークを使用して行うのが最適です。

于 2012-05-02T05:46:59.703 に答える
2

スレッド、共有リソース、同期化されたブロックなどを使用した「就職の面接」ソリューションを考えることができます...しかし、もっと良い方法があると確信しています(それを行う素敵な小さな「遅延書き込み」ライブラリがそこにありますか)私のため?)

「遅延書き込み」ライブラリに出くわしたことはありません。しかし、これは実際には、キュー/バッファーから読み取り、ブロッキング出力に書き込むプライベートスレッドを使用して、キューまたは循環バッファーに書き込む出力ストリーム/ライターにすぎないと思います。これは機能するはずですが、データの二重コピーのコストをコピーすることを避けるのは難しいかもしれません。

java.util.concurrent パッケージのいずれかが役立つものはありますか?

おそらく。

java.nio?

おそらく。

それともJMS/ActiveMQ?

私はそれを疑います...あなたの目標がローカルファイルへの書き込みである場合。

バッファの基礎として PipedOutputStream / PipedInputStream はどうですか?

それは助けになるかもしれません。ただし、ストリームを読み書きするスレッドを実装する必要があります。


これを実装する方法の仕組みを無視すると、この場合、非同期 I/O を実行しても大幅な速度向上は得られないと思います。アプリケーションを現在の形式でプロファイリングすると、主なボトルネックがデータベースからデータを取得していることがわかるでしょう。ファイルへの書き込みは、桁違いに高速になる可能性があります。その場合、データベースとファイルの I/O をオーバーラップさせても、大幅な速度向上は見込めません。

また、ファイル出力がボトルネックであることが判明した場合は、出力ストリームのバッファー サイズを大きくすることで高速化できます。これは簡単に行うことができます - 追加の buffer-size パラメーターをBufferedOutputStreamコンストラクターに追加するだけです。大幅な書き直しに着手する前に、それを試してみてください。

于 2012-05-02T06:11:17.830 に答える
1

Java 7 の「NIO 2」には非同期 I/O があります。

Java 7 を使用できない場合、率直に言って、Java 7 を実装しようとは思いません。先物に関して恐ろしいことをすることもできますが、得られる利益は、マイナスではないにしても、おそらくゼロです。

于 2012-05-02T10:02:08.817 に答える