0

非常に大きなバイナリ ファイルを処理する場合、C でメモリ マッピングを使用すると、fread と比較して違いが生じる可能性があります。多少の時間差があっても大丈夫です。そして、プロセスが大きなバイナリファイルでメモリマッピングを使用し、そこからデータを抽出する方法を理解できない場合はどうなりますか?

ありがとう!!

4

1 に答える 1

2

ファイル全体を最初から最後まで読み取る場合、最も重要なことは、プラットフォームにこれを知らせることです。これにより、アグレッシブな先読みが可能になり、いずれにしても再度読み取られないデータでキャッシュが汚染されるのを回避できます。これは、メモリ マッピングを使用しても使用しなくても実行できます。主な機能はposix_fadviseposix_madviseです。

メモリ マッピングは、ランダムで小規模なアクセスがある場合に大きな効果を発揮します。これは、同じページに複数の書き込みがある場合に特に当てはまります。メモリ マッピングがない場合、読み取りまたは書き込みごとに、ユーザー/カーネルの移行とコピーが必要になります。メモリ マッピングでは、ほとんどの操作はそうではありません。

しかし、シーケンシャル アクセスでは、保存されるのはコピーだけです。奇妙なことに、ユーザー/カーネルの遷移はさらに悪化する可能性があります。大規模な順次読み取りでは、読み取りごとに 1 つのユーザー/カーネル遷移が発生します。読み取りが大きい場合は、256KB ごとになる可能性があります。メモリ マップト ファイルへの大規模なシーケンシャル アクセスでは、すべてのページ (4KB) で障害が発生する可能性があります。これは、カーネルの「フォールト アヘッド」最適化に依存します。

ただし、メモリ マッピングを使用すると、いずれにしてもコピーを実行する必要がないと仮定して、コピーを保存します。何らかの理由でマップされたページからコピーする必要がある場合は、read操作でそれらを適切な場所にコピーすることもできます。ただし、その場でデータを操作できる場合は、メモリ マッピングが有利な場合があります。

一般に、人々が考える傾向があるほど大きな違いはありません。特に、これらすべてのものと比較してディスクがどれほど遅いかを考えると.

于 2012-04-15T04:48:42.860 に答える