5

数百万のレコードを含む大きなディスク ファイル (約 8 GB) があり、それらを読み取り、メモリ内で処理し、別のファイルに書き戻す必要があります。すべてのレコードは固定長 (たとえば 100 バイト) です。

プロセスを並列化して複数のスレッド (通常は 4 ~ 8) で実行することを考えていました。各スレッドには、処理するファイルの特定のセクション (たとえば、1 GB のチャンク) が (排他的に) 割り当てられます。各スレッドは、割り当てられたファイルのセクションへの読み取りと書き込みを制限するため、私のコードから競合の危険性が生じることはありません。

FileStream破損の危険を冒さずに、ロックせずに同じファイルから読み書きするために、それぞれ独自の を持つ複数のスレッドを初期化することはできますか? FileStream.SetLengthターゲット ファイルは事前に ( を使用して) フル サイズに展開されており、各 を開くときに適切なFileShareフラグが指定されていると仮定しますFileStream

また、複数のスレッドが同じファイルに同時にアクセスすると、バッファリングが失われるためにスローダウンが発生するリスクがありますか? FileStreamclassに関する MSDN ドキュメントの「ストリーム位置の変更の検出」セクションについて懸念があります。

オブジェクトのハンドルが排他的に保持されていない場合FileStream、別のスレッドが同時にファイル ハンドルにアクセスし、ファイル ハンドルに関連付けられているオペレーティング システムのファイル ポインターの位置を変更する可能性があります。[…]

メソッドの呼び出しでハンドル位置の予期しない変更が検出されたRead場合、.NET Framework はバッファーの内容を破棄し、ファイルからストリームを再度読み取ります。これは、ファイルのサイズや、ファイル ストリームの位置に影響を与える可能性のあるその他のプロセスによっては、パフォーマンスに影響を与える可能性があります。

これは私の場合に当てはまりますか、それともFileStream同じファイルにアクセスする場合でも、インスタンスによって作成されたファイル ハンドルは別個で独立していますか?

4

2 に答える 2

6

これは完全に安全です。

基になるハンドルを自分で変更した場合にのみ適用されるため、MSDN の記事に記載されている問題のリスクはありません。ハンドルにまったくアクセスしていません。

パフォーマンスを損なう可能性のあるランダムなディスク IO に気付くでしょう。おそらく、ファイルから大きなチャンク (16MB 程度) を読み取り、ロックを使用して読み取りと書き込みの同時呼び出しを防ぐことで、これを軽減する必要があります。IO は OS によってアトミックに処理されないため、異なる FileStream インスタンスであっても同時呼び出しを防止する必要があることに注意してください。内部的には、公平性と予測可能なレイテンシーを実現するために小さなサイズに分割されます。これにより、ランダム IO が発生します。

BlockingCollection にバッファをプッシュするリーダー スレッドを 1 つだけ作成してみませんか? 複数のスレッドで Parallel.ForEach を使用して、そのコレクションを処理できます。

于 2012-06-23T12:25:04.773 に答える
3

「メモリ マップト ファイルは、ファイルの内容をアプリケーションの論理アドレス空間にマップします。メモリ マップト ファイルを使用すると、メモリを同時に管理できるため、プログラマは非常に大きなファイルを操作できます。メモリ マップト ファイルは、複数のプロセス間で共有することもできます。

CreateFromFile メソッドは、指定されたパスまたはディスク上の既存のファイルの FileStream からメモリ マップト ファイルを作成します。ファイルがマップ解除されると、変更は自動的にディスクに反映されます。

CreateNew メソッドは、ディスク上の既存のファイルにマップされていないメモリ マップト ファイルを作成します。プロセス間通信 (IPC) 用の共有メモリの作成に適しています。

メモリ マップト ファイルには名前が関連付けられています。

ファイルの一部のビューを含む、メモリ マップト ファイルの複数のビューを作成できます。ファイルの同じ部分を複数のアドレスにマップして、並行メモリを作成できます。2 つのビューを同時に使用するには、同じメモリ マップト ファイルから作成する必要があります。2 つのビューで同じファイルの 2 つのファイル マッピングを作成しても、同時実行性は提供されません。」

http://msdn.microsoft.com/en-us/library/system.io.memorymappedfiles.memorymappedfile.aspx

于 2012-06-23T12:15:52.617 に答える