2011-11-15 4 views
0

現在、Webサイトをクロールしてテキストをファイルに書き込むマルチスレッドプログラムがあります。 CPUを賢明に使用すると、すぐにたくさんのスレッドを実行できますが、すぐにI/Oがボトルネックになります。私は、各スレッドがArray Blocking Queueに書き込むことができると考えていましたが、使用可能な32GB以上のRAMを生成する予定です。配列を特定のサイズに達した後にテキストファイルにダンプして、その空き領域を解放する方法はありますか?または、私が紛失しているこのI/O問題を回避する別の方法がありますか?複数のスレッドを使用して複数のファイルに書き込むときにI/Oボトルネックを回避する方法

+0

コレクションを使用してシリアル化できませんでしたか?それからあなたは書いているオブジェクトを交換するだけです。 –

+0

私はアレイのゲートキーパーである単一のスレッドを作成します。いくつかの機能を持つ配列にアクセスします。配列が特定のサイズに達すると、配列の一部をディスクに書き出すワーカースレッドを起動します。 1つのスレッドを使用するだけで、ファイルは線形になり(単純なままにしておくと)、ディスクはCPUでなくボトルネックになります。 – EdH

答えて

2

画像を撮りましょう.1秒あたり300MBの速度で書き込むことができるSATA 2コントローラがあります。今は疑似コンピュータのインターネット接続帯域幅は何ですか?私は、イーサネットアダプタでサポートされている、生産における最後の最大帯域幅が1 GB /秒であることを知っています。しかし、私はそのようなインターネット接続の帯域幅は非常に高価だと思う(私はいくつかの商業ホストがそれをサポートしているかどうかも疑問だ)。 300MB /秒のインターネット接続で十分だと思います。私たちのコンピュータにはそのようなものがあります。

結果は

 Input (300 MB/s); 

     Writing (300 MB/s). 

再開です:あなたはインターネットをダウンロードする場合は、接続やディスクなどのディスクコントローラを増やす必要があります。それ以外の場合は300 MB/sはかなりいいね。スレッドはあなたを助けません。 CPUとメモリは私たちの問題にも関係しません。

0

私は、ディスクI/Oがボトルネックだと思います。そう多くのファイルをスラッシングしています。一度にすべてのファイルを書き込むことができますか?サイトをクロールし、バッファコレクションにバッファを追加し、バッファコレクションを1つのファイル書き込みスレッドにキューイングしますか?そのシーケンシャルな書き込みはディスクのパフォーマンスを向上させるでしょうか?全サイトをバッファリングできない場合は、サイトごとに十分なバッファインスタンスを収集して、ディスクの価値を書くことができます(収集された合計が64Kを超えると、わかりません)。新しいバッファセットを収集します。

マルチファイル書き込みのレイテンシを改善する簡単な方法 - SSDを取得する。

1

私は "トン"のスレッドを実行しません。私は最大のスループットを提供するリーダースレッドの数を見つけるまで、特定のシステム上のさまざまな数のスレッドでプロファイルを作成しました。私はこの数字がかなり小さいと思う。基本的には、他のサーバーの応答を待っている間にCPUをビジーに保つだけで十分です。

書き込みしようとしている物理ドライブごとにライタースレッドが1つあります。有限のサイズのBlockingQueueを持つライタースレッドに読み取りスレッドを接続します。読者がディスクよりもずっと先に進んだら、これは彼らの活動を抑えます。

0

スレッド数を減らす!彼らはあなたをあまり買わない。全体の問題は、一方の端でネットワークバインドされ、他方の端でディスクバインドされます。多くのCPUはまったく関わっていません。

関連する問題