2009-12-07 11 views
40

私は、ネットワークを介してデータのチャンクを受信し、ディスクに書き込むアプリケーションを持っています。 すべてのチャンクが受信されると、実際に表現されている1つのファイルにデコード/再結合できます。いつメモリマップファイルを使用するのですか?

メモリマッピングされたファイルを使用するのが有益かどうかは不思議です。まず、ディスクに単一のチャンクを書き込みます。次に、すべてがデコードされた単一のファイルを書き込みます。

私自身の気持ちは、それが2番目のケースのみに役立つかもしれないということです、誰かがこれについていくつかのアイデアを持っていますか?

編集: これはC#アプリケーションで、x64バージョンのみを計画しています。 (したがって、「最大の連続した空き領域」の問題には関係しないはずです)

+0

お電話をよろしくお願いします。丁寧に投稿を編集しました。これはx64のみのアプリです。 – Pygmy

+1

MMファイルを使用するとどのようなメリットがありますか? –

+0

通常、速度がmmapされたファイルの主な利点ではありませんか? –

答えて

25

メモリマップファイルは、かなり大きなファイルの比較的小さい部分(ビュー)が繰り返しアクセスされる必要があるシナリオにとって有益です。

このシナリオでは、オペレーティングシステムは、マップされたファイルの最近使用された部分のみをページイン/フェイインすることによって、アプリケーションの全体的なメモリ使用量とページング動作を最適化するのに役立ちます。

さらに、メモリマップファイルは、コピーオンライトなどの興味深い機能を公開したり、共有メモリのベースとして機能したりすることができます。

メモリマップファイルは、チャンクが順不同で到着した場合にファイルをアセンブルするのに役立ちます。ただし、事前に最終的なファイルサイズを知る必要があります。

また、チャンクを書き込むためには、ファイルに一度だけアクセスする必要があります。したがって、明示的に実装された非同期I/Oよりもパフォーマンス上の利点はありそうにありませんが、ファイルライターを正しく実装する方が簡単で簡単です。

In。NET 4、Microsoftはメモリマップされたファイルのサポートを追加しました。 http://blogs.msdn.com/salvapatuel/archive/2009/06/08/working-with-memory-mapped-files-in-net-4.aspx

+4

私はmmf'sが小さいビューのためだけであることに同意します。 64ビットシステムでは、ファイル全体に簡単にビューを置くことができます。ビューの再配置は、高価なIO操作です。 –

+2

あなたはそうです。これらは、任意の大規模または全ファイルビュー、特に64ビットのアドレス空間で使用できます。しかし、それは特にファイルが一度だけ読み書きされているときに輝く場所ではありません。 このような場合、非同期I/Oは効率的ですが、正しく実装するのは難しくなります。 – user33675

3

私は両方のケースが関連していると言います。単一のチャンクをメモリマップファイル内の適切な場所に書き込んで、順番どおりに並べ替えます。これはもちろん、ビットトレントダウンローダのように各チャンクをどこに置くべきかを知っている場合にのみ便利です。チャンクがどこに行くべきかを知るために何らかの余分な分析を行う必要がある場合、メモリマップされたファイルの利点はそれほど大きくないかもしれません。

12

メモリマップファイルは、主にプロセス間通信またはI/Oパフォーマンスの向上に使用されます。

あなたの場合、より良いI/Oパフォーマンスを得ようとしていますか?メモリマップされたアプローチはマイナーページフォルトでそのコストを持ってい http://en.wikipedia.org/wiki/Memory-mapped_file

具体的に...

...

はobiviousを指摘して嫌い、しかし、ウィキペディアは、状況の良いランダウンを与えます - データのブロックがページキャッシュにロードされているが、まだプロセスの仮想メモリ空​​間にマップされていない場合状況に応じて、メモリマップされたファイルI/Oは、実際には標準のファイルI/Oよりもかなり遅くなる可能性があります。

スピードを早めに最適化しているようです。なぜ、通常のファイルのアプローチではなく、後でMMファイルのリファクタリングが必要な場合は?

+2

私はより良いIOパフォーマンスを目指しています。 私は今では約12MB /秒のデータを取得していますが(将来的にはこれ以上になるでしょう)、できるだけ速く処理/ディスクに書き戻す必要があります。 私はウィキペディアの記事を読みましたが、読んだときのメリットを理解していますが、ファイルへの*書き込み*が私には分かりません。なぜそれを理解するのが助けになるのですか? ) – Pygmy

関連する問題