数百万のレコードを含む大きなディスク ファイル (約 8 GB) があり、それらを読み取り、メモリ内で処理し、別のファイルに書き戻す必要があります。すべてのレコードは固定長 (たとえば 100 バイト) です。
プロセスを並列化して複数のスレッド (通常は 4 ~ 8) で実行することを考えていました。各スレッドには、処理するファイルの特定のセクション (たとえば、1 GB のチャンク) が (排他的に) 割り当てられます。各スレッドは、割り当てられたファイルのセクションへの読み取りと書き込みを制限するため、私のコードから競合の危険性が生じることはありません。
FileStream
破損の危険を冒さずに、ロックせずに同じファイルから読み書きするために、それぞれ独自の を持つ複数のスレッドを初期化することはできますか? FileStream.SetLength
ターゲット ファイルは事前に ( を使用して) フル サイズに展開されており、各 を開くときに適切なFileShare
フラグが指定されていると仮定しますFileStream
。
また、複数のスレッドが同じファイルに同時にアクセスすると、バッファリングが失われるためにスローダウンが発生するリスクがありますか? FileStream
classに関する MSDN ドキュメントの「ストリーム位置の変更の検出」セクションについて懸念があります。
オブジェクトのハンドルが排他的に保持されていない場合
FileStream
、別のスレッドが同時にファイル ハンドルにアクセスし、ファイル ハンドルに関連付けられているオペレーティング システムのファイル ポインターの位置を変更する可能性があります。[…]メソッドの呼び出しでハンドル位置の予期しない変更が検出された
Read
場合、.NET Framework はバッファーの内容を破棄し、ファイルからストリームを再度読み取ります。これは、ファイルのサイズや、ファイル ストリームの位置に影響を与える可能性のあるその他のプロセスによっては、パフォーマンスに影響を与える可能性があります。
これは私の場合に当てはまりますか、それともFileStream
同じファイルにアクセスする場合でも、インスタンスによって作成されたファイル ハンドルは別個で独立していますか?