2010-12-08 13 views
1

"synchronized"を使用する方法は明らかです。 しかし、私はいくつかのコアで動作するように設計されたシステム を作成し、そのファイルに同じmilisecondで何度も書き込んでいます。 同期を使用するとパフォーマンスが悪くなると思います。 私は、Javaのパイプクラスを使用することを考えていました(しかし、それが助けになるかどうかわからない) または各スレッドに別のファイルへの書き込みを依頼し、最後の結果を作成するためにこれらの書き込みを 収集するスレッドを追加しました。 私は、文章の順序は重要ではなく、とにかくナノタイマーでタイムスタンプ であることを言及する必要があります。 これらの2つのより良いアイデアは何ですか?他の提案がありますか?ありがとう。 複数のスレッドを同期して同じファイルに書き込むことも可能です

+0

どのスピードのスピード、スループット、またはレイテンシを指定する必要があります。 1msに10k m/sのメッセージを書く必要がありますか?また、ディスクへの書き込みの信頼性を気にしている場合(プロセスクラッシュ時の遅延書き込みを緩和できるかどうか) – DaveC

答えて

2

何らかの同期(例:単一のmutex)を使用することは、実装が非常に簡単です。

私は十分なRAMがあれば、ログプロデューサスレッドごとにいくつかの種類のキューを作成し、すべてのキューからラウンドロビン方式(またはそのようなもの)で読み込むログコンシューマスレッドを作成します。 。

1

あなたの質問に直接答えはありませんが、logbackプロジェクトには、異なるスレッドから同じファイルに書き込むための同期機能が組み込まれているため、必要に応じて使用するか、ソースコードを見てください。それは速度のために作られているので、私は実装が当然と考えられないと確信しています。

1

パフォーマンス上の問題がなくても、すべてのスレッドが同じファイルに書き込むことはできません。

私はこの問題(Log4jの前に戻って私自身のロギングを書く)があったとき、私はメモリ内に2つの固定サイズのバッファを作り、専用のコンシューマスレッドが他のバッファから読み込み、ファイルに書きました。このようにして、ライタースレッドは、バッファへのインデックスの取得とインクリメント時のみ、およびバッファがスワップされているときに同期化を行わなければならず、現在のバッファがいっぱいになったときにのみブロックされます。それは記憶集中的でしたが、速かったです。

Log4jやLogbackのようなロガーがどのように機能しているかを調べるには、この問題を解決する必要があります。

1

JMSを使用してください。異なるマシン上で実行されているすべてのプロセスが、ファイルに書き込む代わりにJMSメッセージを送信することがあります。メッセージを受信して​​ファイルに書き込むキュー受信者を1つだけ作成します。 Log4Jには既にこの機能があります。JMSAppenderを参照してください。

関連する問題