10

Can I write to different parts of the same file concurrently from multiple threads (on a typical PC)? I mean there's only one disk head, so the writes can be only performed in some order anyway i.e. not in parallel, right?

Edit:

I'm writing a program that sorts a large binary file but the majority of time is still spent on disk I/O, so I'm just wondering will I gain any extra speed by doing I/O in parallel.

4

4 に答える 4

6

複数のスレッドが同じファイルの異なる部分に書き込むのを止めるものは何もありません。

大きなバイナリ ファイルを並べ替えるプログラムがありますが、大部分の時間はまだディスク I/O に費やされています。

プログラムがディスクにバインドされている場合、マルチスレッド化しても (同じディスクに同じ量のデータを書き込んでも) 高速化されません。

従来のハード ドライブについて話している場合、シーケンシャル I/O は一般に、ディスク ヘッドを前後に移動させる I/O よりも高速です。これを念頭に置いて、スレッド間で I/O を分割することは逆効果になることさえあります。

スピードアップに関しては、いくつかの方法があります。

  1. I/O の量を減らす (たとえば、必要な I/O が少ないソート アルゴリズムを使用するか、メモリ内でより多くの作業を行うことにより)。
  2. より高速なドライブを使用するなどして、I/O スループットを改善します。
于 2013-03-18T13:28:09.133 に答える
3

ファイル処理は多少異なり、これを許可する特定のファイルモードが必要になる場合がありますが、少なくとも unix(-like) オペレーティングシステム、おそらく Windows でも可能です (編集: 詳細については、bizzehdeeの回答を参照してください)。

実行中のオペレーティング システムでは、「ファイル」は実際には論理的なエンティティであり、その状態の一部は常にディスクに保存されますが、一部の変更はカーネル バッファーのみに保存されます。したがって、ある意味では、ファイルへの書き込みは共有メモリのブロックへの書き込みと同じであり、API のみが異なります (使用する場合でも違いますmmap)。

しかし、要するに、シークして書き込むだけで、ファイル内の古いバイトが上書きされます。2 つのプロセスが同じバイトに重複して書き込む場合、最終結果は未定義であり、いずれにせよ、正しく機能しているシステムでは決して起こらないことであり、これを行うプログラムには書き込みの重複を防ぐメカニズムが必要です。


スピードアップについて: 本当に何をするかによります。生の書き込みだけを実行すると、従来の回転するハードディスクでは速度が低下したり、ファイルが断片化しやすくなったりする可能性があります。SSD では、おそらくスローダウンはありませんが、スピードアップもありません。

一方、操作が CPU バウンドであり、複数のコアがあり、並列処理を行うと合計 CPU 使用率が高くなる場合、同じ出力ファイルのさまざまな部分を並列処理すると速度が向上します。ファイルに書き込まれたバイト数と比較して多くの処理がある場合は、たくさん。

于 2013-03-18T13:26:10.013 に答える
2

を見て、利用する必要がCreateFileExありWriteFileExますlpOverlapped。これにより、複数のスレッドで同時に同じファイルに対して非同期の読み取りおよび/または書き込みが可能になります。

http://msdn.microsoft.com/en-us/library/windows/desktop/aa365748(v=vs.85).aspx

于 2013-03-18T13:27:27.613 に答える
0

はい、可能ですが、他の人が言うように、一般的なケースではパフォーマンスが向上する可能性はほとんどありません.

ただし、あなたのステートメントの1つは実際には正しくありません。

ディスクヘッドは1つだけ

まず、通常は面ごとに 1 つあるため、シングル プラッターの HDD でも 2 つのヘッドがあります。もちろん、マルチプラッターのものにはもっと多くのものがあります。

複数のプラッターを備えたドライブの中には、すべてのプラッターを同時に読み書きできるものもあります。80 年代の一部の富士通イーグル ドライブはこれを行い、非圧縮のデジタル ビデオ信号を記録できる最初のシステムに使用されました。もちろん、これは「ランダム アクセス」ではありません。すべてのヘッドが一緒に移動するからです。最新のドライブがこの手法を使用しているかどうかはわかりません。

于 2013-12-19T13:31:58.317 に答える