ネットワーク経由でデータのチャンクを受信し、それらをディスクに書き込むアプリケーションがあります。すべてのチャンクが受信されると、実際に表す単一のファイルにデコード/再結合できます。
メモリ マップ ファイルを使用することが有用かどうか疑問に思っています。
私自身の感覚では、2 番目のケースにのみ役立つ可能性があります。
編集: これは C# アプリであり、x64 バージョンのみを計画しています。(したがって、「最大連続空き領域」の問題に遭遇することは関係ありません)
ネットワーク経由でデータのチャンクを受信し、それらをディスクに書き込むアプリケーションがあります。すべてのチャンクが受信されると、実際に表す単一のファイルにデコード/再結合できます。
メモリ マップ ファイルを使用することが有用かどうか疑問に思っています。
私自身の感覚では、2 番目のケースにのみ役立つ可能性があります。
編集: これは C# アプリであり、x64 バージョンのみを計画しています。(したがって、「最大連続空き領域」の問題に遭遇することは関係ありません)
メモリ マップト ファイルは、非常に大きなファイルの比較的小さな部分 (ビュー) に繰り返しアクセスする必要がある場合に役立ちます。
このシナリオでは、オペレーティング システムは、マップされたファイルの最近使用された部分のみをページインおよびページアウトすることにより、アプリケーションの全体的なメモリ使用量とページング動作を最適化するのに役立ちます。
さらに、メモリ マップト ファイルは、コピー オン ライトなどの興味深い機能を公開したり、共有メモリの基盤として機能したりできます。
このシナリオでは、メモリ マップト ファイルは、チャンクが順不同で到着した場合にファイルを組み立てるのに役立ちます。ただし、最終的なファイル サイズを事前に把握しておく必要があります。
また、チャンクを書き込むために、ファイルに一度だけアクセスする必要があります。したがって、明示的に実装された非同期 I/O よりもパフォーマンスが向上する可能性はほとんどありませんが、ファイル ライターを正しく実装する方が簡単で迅速な場合があります。
.NET 4 では、Microsoft はメモリ マップ ファイルのサポートを追加し、サンプル コードを含むいくつかの包括的な記事があります。 map-files-in-net-4.aspx .
メモリ マップト ファイルは、主にプロセス間通信または I/O パフォーマンスの向上に使用されます。
あなたの場合、I/O パフォーマンスを向上させようとしていますか?
明白なことを指摘するのは嫌いですが、ウィキペディアは状況の良い概要を示しています... http://en.wikipedia.org/wiki/Memory-mapped_file
具体的には...
メモリ マップド アプローチは、マイナー ページ フォールト (データ ブロックがページ キャッシュに読み込まれているが、プロセスの仮想メモリ空間にまだマップされていない場合) にコストがかかります。状況によっては、メモリ マップド ファイル I/O は、実際には標準のファイル I/O より大幅に遅くなる可能性があります。
時期尚早に速度を最適化しようとしているようです。通常のファイル アプローチではなく、後で必要に応じて MM ファイルをリファクタリングしないのはなぜですか?
両方のケースが関連していると思います。単一のチャンクをメモリ マップ ファイル内の適切な場所に、順不同で書き込むだけです。これはもちろん、bittorrent ダウンローダーのように、各チャンクがどこに行くべきかがわかっている場合にのみ役立ちます。チャンクの移動先を知るために追加の分析を実行する必要がある場合、メモリ マップド ファイルの利点はそれほど大きくない可能性があります。