現在、Webサイトをクロールしてテキストをファイルに書き込むマルチスレッドプログラムがあります。 CPUを賢明に使用すると、すぐにたくさんのスレッドを実行できますが、すぐにI/Oがボトルネックになります。私は、各スレッドがArray Blocking Queueに書き込むことができると考えていましたが、使用可能な32GB以上のRAMを生成する予定です。配列を特定のサイズに達した後にテキストファイルにダンプして、その空き領域を解放する方法はありますか?または、私が紛失しているこのI/O問題を回避する別の方法がありますか?複数のスレッドを使用して複数のファイルに書き込むときにI/Oボトルネックを回避する方法
答えて
画像を撮りましょう.1秒あたり300MBの速度で書き込むことができるSATA 2コントローラがあります。今は疑似コンピュータのインターネット接続帯域幅は何ですか?私は、イーサネットアダプタでサポートされている、生産における最後の最大帯域幅が1 GB /秒であることを知っています。しかし、私はそのようなインターネット接続の帯域幅は非常に高価だと思う(私はいくつかの商業ホストがそれをサポートしているかどうかも疑問だ)。 300MB /秒のインターネット接続で十分だと思います。私たちのコンピュータにはそのようなものがあります。
結果は
Input (300 MB/s);
Writing (300 MB/s).
再開です:あなたはインターネットをダウンロードする場合は、接続やディスクなどのディスクコントローラを増やす必要があります。それ以外の場合は300 MB/sはかなりいいね。スレッドはあなたを助けません。 CPUとメモリは私たちの問題にも関係しません。
私は、ディスクI/Oがボトルネックだと思います。そう多くのファイルをスラッシングしています。一度にすべてのファイルを書き込むことができますか?サイトをクロールし、バッファコレクションにバッファを追加し、バッファコレクションを1つのファイル書き込みスレッドにキューイングしますか?そのシーケンシャルな書き込みはディスクのパフォーマンスを向上させるでしょうか?全サイトをバッファリングできない場合は、サイトごとに十分なバッファインスタンスを収集して、ディスクの価値を書くことができます(収集された合計が64Kを超えると、わかりません)。新しいバッファセットを収集します。
マルチファイル書き込みのレイテンシを改善する簡単な方法 - SSDを取得する。
私は "トン"のスレッドを実行しません。私は最大のスループットを提供するリーダースレッドの数を見つけるまで、特定のシステム上のさまざまな数のスレッドでプロファイルを作成しました。私はこの数字がかなり小さいと思う。基本的には、他のサーバーの応答を待っている間にCPUをビジーに保つだけで十分です。
書き込みしようとしている物理ドライブごとにライタースレッドが1つあります。有限のサイズのBlockingQueue
を持つライタースレッドに読み取りスレッドを接続します。読者がディスクよりもずっと先に進んだら、これは彼らの活動を抑えます。
スレッド数を減らす!彼らはあなたをあまり買わない。全体の問題は、一方の端でネットワークバインドされ、他方の端でディスクバインドされます。多くのCPUはまったく関わっていません。
- 1. Ada:ファイルに複数回書き込む
- 2. 複数のスレッドで複数のファイルを書き込む方法は?
- 3. Cで複数回ファイルに書き込む方法は?
- 4. stringValueを使用してIBOutletラベルに複数回書き込む方法
- 5. 同じファイルに複数のスレッドを書き込む
- 6. 関数を使用して複数の変数をファイルに書き込む
- 7. 複数のスレッドで書き込みファイルを読み込む
- 8. 複数のファイルに書き込む
- 9. 複数のcsvファイルに書き込む
- 10. 複数のunittestを複数のファイルでダーツに書き込む方法は?
- 11. ディレクトリ内の複数のファイルにデータを書き込む方法
- 12. 複数のスレッドで1つのファイルに書き込む方法は?
- 13. 複数の.csvファイルを書き込む
- 14. NodeJSを使用して複数の場所にサブクエリを書き込む方法
- 15. バットファイル:複数のファイルを解析してCSVに書き込む
- 16. 同じフォームを使用して複数のテーブルに複数の挿入を書き込む方法PHP
- 17. xmlを使用してhtmlに複数行を書き込む方法
- 18. 複数の辞書をPython 3.xの複数のcsvファイルに書き込む
- 19. 複数の行列を書き込むことなくMatlabのファイルに書き込む方法
- 20. 複数のファイルを読み込んで複数のテーブルに書き込むバッチジョブ
- 21. 複数のスレッドからsqliteにデータを書き込む最良の方法
- 22. forループで複数のサブプロセスを使用して同じファイルに書き込む
- 23. 複数の.ncを開き、複数のラスタを書き込む
- 24. PropertiesConfigurationを使用して複数の行プロパティ値を書き込む方法は?
- 25. Javaの複数のスレッドからFileOutputStreamに書き込む
- 26. CSVファイルをスレッド間で中断することなく複数のスレッドで書き込む方法は?
- 27. 複数の値をテキストファイルの1行に書き込む方法
- 28. 複数のスレッドによるファイル書き込みの動作
- 29. 複数のスレッドからTraceListenerに書き込む
- 30. 複数のスレッドが同じブール値に書き込む
コレクションを使用してシリアル化できませんでしたか?それからあなたは書いているオブジェクトを交換するだけです。 –
私はアレイのゲートキーパーである単一のスレッドを作成します。いくつかの機能を持つ配列にアクセスします。配列が特定のサイズに達すると、配列の一部をディスクに書き出すワーカースレッドを起動します。 1つのスレッドを使用するだけで、ファイルは線形になり(単純なままにしておくと)、ディスクはCPUでなくボトルネックになります。 – EdH