メモリ マップ ファイルの原則はかなり移植性がありますが、Windows には mmap() がありません (ただし、MapViewOfFile() のようなものは存在します)。 Python mmap モジュールの C コードをのぞいて、さまざまなプラットフォームでどのように機能するかを確認できます。
大きなファイルの大きなビットをアドレス空間にマッピングすることに依存している場合、ファイルの読み取りに mmap を使用することは移植性がありません。多くの場合、1G マッピング用です。
mmap()
関数は POSIX 呼び出しです。 MacOS X (および Linux、HP-UX、AIX、Solaris) で正常に動作します。
問題の領域は Windows です。 _mmap()
があるかどうかわかりません POSIX 'compatibility' サブシステムで呼び出します。そこにある可能性が高いですが、名前の先頭にアンダースコアが付いた名前になります。これは、Microsoft が名前空間に対して別の見方をしており、mmap()
を考慮しているためです。 POSIX機能を要求したとしても、ユーザーネームスペースに侵入することはできません.代替の Windows インターフェイス MapViewOfFile()
の定義を見つけることができます。 別の SO の質問 (mmap()
対読み取りブロック)
32 ビット システムで大きなファイルをマップしようとすると、ファイル全体をメモリに割り当てるのに十分な連続した領域がなく、メモリ マッピングが失敗することがあります。うまくいくと思い込まないでください。失敗した場合の代替戦略を決定してください。
UNIX 上のメモリ マップド io は対話型アプリケーションには使用できないと考えています。これは、SIGSEGV/SIGBUS が発生する可能性があるためです (ファイルが他のプロセスによって途中で切り捨てられた場合)。 SIGSEGV/SIGBUS を取得した後にプロセスを終了する以外にできることがあります。このようなシグナルを例外に変換する新しい G++ 機能は、主に Apple OS を対象としているようです。この G++ 機能に関する情報は、どこでも見つけることができません。Windows で見られるような構造化された例外処理が 20 年以上にわたって UNIX に導入されるまで、おそらく数年待たなければなりません。