同時書き込み操作または順次書き込み操作 -- 速度の点で重要ですか?
マルチコア プロセッサでは、速度を上げるためだけに、マルチ スレッドを使用してすべてのファイル書き込み操作を並列化することに意味がありますか? もちろん、これらの書き込み操作はすべて独立しています。
同時書き込み操作または順次書き込み操作 -- 速度の点で重要ですか?
マルチコア プロセッサでは、速度を上げるためだけに、マルチ スレッドを使用してすべてのファイル書き込み操作を並列化することに意味がありますか? もちろん、これらの書き込み操作はすべて独立しています。
一般的に、いいえ。
現時点では、ディスクへの物理的な書き込みが数桁のボトルネックであり、ほとんどのシナリオではむしろシーケンシャルです。書き込みを並列化すると、シークが発生してパフォーマンスが低下する可能性が高くなります。シーケンシャルな読み取りと書き込みは、ほとんどの場合、インターリーブよりも大幅に優れています。
ディスクごとの並列化 (TCQ および NCQ) は、主に、異なるクライアントがディスクの異なるセクションから同時にデータを要求する場合に当然必要となるシークを減らすことによって機能します。そもそもこれらのシークを回避できれば、より良い結果が得られます。
いくつかのシナリオ (RAID 1、JBOD、またはさまざまなデータ ストリームの到着がかなり遅い場合) では、適切なスケジューリングによってスループットを向上させることができますが、それには手元のハードウェアに関する詳細な知識が必要であり、他のプロセスが楽しみを損なわないようにする必要があります。
せいぜい、それをエンド ユーザーに決定として任せ (たとえば、それをオフにするオプションを与える)、エンド ユーザーをガイドするためのパフォーマンス測定を提供することができます。(あなたは私が間違っていることを証明するかもしれません;))
これは、ディスクとそのコントローラーによって異なります。彼らは TCQ/NCQ を持っていますか? RAIDですか?もしそうなら、それはいくつかの意味があるかもしれません。NCQ のない 1 つの通常の SATA ディスクでは、そうはなりません。
最初に最も単純なコードを記述し、それがターゲット環境で十分に機能するかどうかを確認します。(異なるディスク、オペレーティング システムのバージョン、CPU、ドライバーなどが結果に大きな影響を与える可能性があります。)
最も単純な正しいコードが十分に高速でない場合は、より高速に IO を実行する方法を考え出すことは理にかなっています。推測では、異なるディスクに書き込む場合は書き込み操作を並列化するのが理にかなっているかもしれませんが、それ以外の場合はそうではない可能性があります。ただし、それは完全な推測にすぎません。
まったくの偶然ですが、近いうちに関連する状況をベンチマークする予定です。実行する予定のテストを説明するブログ投稿があり、結果が得られたら、結果へのリンクでエントリを更新します。それはあなたが説明しているものとまったく同じではありませんが、おそらく興味深いものになるのに十分近い.
技術的には、ファイルを mmap して複数のスレッドで書き込むことができますが、ディスクがボトルネックになる可能性があります。
I/O スループットを最大化する必要がある場合は、環境がサポートする非同期 I/O を調査することから始めます。
これは簡単な質問ですが、答えは非常に複雑です。ここでは、いくつかの仮定を使用してシナリオを絞り込もうとします。OS は Windows であり、真に独立した比較的多数の書き込みがあります。
最悪の場合、これは、パラレル ATA コントローラー上の単一の普通の毎日のディスクよりも遅くなります。遅くなります。
最良のケースでは、OS は非常に効率的に書き込みをスケジュールできます。これは、多数のスピンドルを備えたストレージ システムや、NCQ をサポートするディスクを備えたストレージ システムの場合に当てはまります。
ここで覚えておくべき重要なことは、ディスク I/O (一般に) は CPU バウンドではないということです。それは人生を複雑にするだけです。
書き込みを順序付けして、ファイル内で (全体的に) シーケンシャルになるようにするか、ディスク上でシーケンシャルになるように、エクステントで並べ替えると、問題が解決することに注意してください。
1 つのファイルへの書き込みについて話している場合、答えはノーです。書き込みを行うには、すべてのプロセスまたはスレッドが OS からファイルのロックを取得する必要があるため、1 つのファイルへの書き込みを並列化することはできません。
それ以外の場合は、ハードウェア コントローラーとストレージの種類、OS カーネルとファイルシステムの実装に依存する必要があります。