非常に大きなバイナリファイルを処理する際に、Cでメモリマッピングを使用するとfreadと比較して違いはありますか?たとえ小さな違いがあっても、それは良いでしょう。そして、プロセスが大規模なバイナリファイルでメモリマッピングを使用し、そこからデータを抽出する方法を知っているのであれば、Cでメモリマッピングを使用してバイナリファイルを読み取る
ありがとうございます!
非常に大きなバイナリファイルを処理する際に、Cでメモリマッピングを使用するとfreadと比較して違いはありますか?たとえ小さな違いがあっても、それは良いでしょう。そして、プロセスが大規模なバイナリファイルでメモリマッピングを使用し、そこからデータを抽出する方法を知っているのであれば、Cでメモリマッピングを使用してバイナリファイルを読み取る
ありがとうございます!
ファイル全体を読み終えたら、最も重要なことはプラットフォームにこれを知らせることです。これにより、先読みを積極的に実行できるようになり、とにかく再度読み取られないデータでキャッシュを汚染することを避けることができます。これは、メモリマッピングでも、それなしでも可能です。キー機能はposix_fadvise
とposix_madvise
です。
ランダムで小さなアクセスがある場合、メモリマッピングは大きなメリットです。これは、同じページへの複数の書き込みがある場合に特に当てはまります。メモリマッピングがなければ、各読み取りまたは書き込みにはユーザー/カーネルの移行とコピーが必要です。メモリマッピングでは、ほとんどの操作では対応しません。
ただし、順次アクセスでは、すべてが保存されます。奇妙なことに、ユーザー/カーネルの移行はさらに悪化する可能性があります。大規模な順次読み取りでは、読み取りごとに1つのユーザー/カーネルの遷移が発生します。読み取りが大きい場合は256KBになります。メモリマップされたファイルへの大きな順次アクセスでは、すべてのページ(4KB)に障害が発生する可能性があります。カーネルの「フォールト・アヘッド」最適化に依存します。
ただし、メモリマッピングでは、コピーを保存する必要はありません。何らかの理由でマッピングされたページをコピーアウトする必要がある場合は、read
オペレーションでそれらをコピーしてあなたのために置くこともできます。しかし、その場でデータを操作することができれば、メモリマッピングが勝つかもしれません。
一般的に、人々はそれがそうであると思う傾向があるので、それほど大きな違いはありません。特にディスクがどれくらい遅いかをこのすべてのものと比較して考えると、
ありがとうございました。ですから、メモリマッピングをしようとすると、コンパイルエラーが発生します。私のコードは次のようである: の#include
'mmap'の最初のパラメータは' NULL'でなければなりません。また、4,000は正当なオフセットではありません。オフセットはページサイズの倍数でなければなりません。 –
これはプラットフォーム固有のものです。 C言語自体は、ファイルをメモリマップする方法を提供しません。プラットフォームを指定せずに「方法」の部分に賢明な答えを得ることはありません。アクセスパターンについての詳細な説明がなくても、「なぜ」の部分に合理的な回答は得られません。 –
これはLinuxプラットフォーム上にあります – AndroidDev93
次に、 "how"答えは "man mmap"です。しかし、「なぜ」については、依然としてアクセスパターンを知る必要があります。 (ランダム?シーケンシャル?各バイトは1回だけですか?いくつかのバイトは他のバイトよりも大きいですか?小さい読み取り?大きな読み取り?これはちょうど読んでいますか?) –