マイシステム: 物理メモリ:3GB
のWindows XPのService Pack 3(32bit版) スワップファイルサイズ:
最大メモリマップ割り当てサイズ?
目標を30GB:私は私のマシン上に割り振ることができる最大の可能なメモリ・マップ・サイズを確認するには。
2GBのメモリマップファイルを割り当てるために次のコードを実行すると、呼び出しは失敗します。
handle = CreateFileMapping(INVALID_HANDLE_VALUE、NULL、PAGE_READWRITE | SEC_COMMIT、0、INT_MAX、NULL);
メモリマップファイルを30GBのシステムスワップファイルサイズまで割り当てることができるので、私は一度に100MBのCreateFileMappingを絶えず呼び出すことで、非常に困惑しています。
マシンを再起動し、2GBのメモリマップファイルをCreateFileMappingに要求するアプリケーションを再実行した後、正常に動作し、有効なハンドルが返されます。だから、これはちょっと混乱して、窓のあるフードの下で何が起こっているのですか?
このような状況では、すべてのシステムページファイル(30GB)を使用して多数の小さなメモリマップファイルを作成できますが、2GBの割り当てを1回要求すると呼び出しは失敗します。マシンを再起動して同じアプリケーションを実行すると、呼び出しは成功します!
メモ:
1)メモリマップされたファイルがproccess仮想アドレス空間にロードされていないため、ファイルにはまだビューがありません。
2)OSは、システムページファイル30GBに小さな100MBのメモリマップファイルを割り当てることができます!
Windows XP SP3(32ビット)仮想メモリマネージャが要求された2GBのシステムページファイルを正常に確保できないため、システムメモリの断片化ページファイルがそれぞれ4kbであっても、メモリの割り当てを引き続き予約する必要があるようです)。再起動後、私はシステムメモリの断片化が少ないと仮定して、同じ呼び出しが成功し、サイズが2GBのメモリマップファイルを割り当てます。
私はいくつかの実験を行いました。マシンを1日実行した後、300Mbのメモリマップファイルを割り当てた小さなアプリケーションを開始してリリースしました。その後、サイズを1MB増やしてやり直してください。最後に、700MBで停止し、レポート(不十分なシステムリソース)を報告します。私はそれから、各アプリケーションを終了し、これが順番にエラーメッセージを停止し、最終的にサイズが3.5GBのメモリマップファイルを割り当て続けます!
ここで私の質問は何ですか? 100MBのメモリマップファイルを割り当てると、システムページファイル(コミット制限)の30GBまでが消費されるため、仮想メモリマネージャで内部的に何らかのタイプのメモリ断片化が発生する必要があります。あなたはINVALID_HANDLE_VALUEとシステムページファイルに裏打ちされた大容量のメモリマップファイルを作成するつもりなら
更新
結論は、その後、システムページファイル(スワップファイル)が必要なサイズにリサイズすることが必要であり、 大きな割り当て> 2gbの場合、フラグメント化されていない状態にする必要があります。重いIO負荷の下ではまだ失敗する可能性があります。これらすべての問題を回避するために、必要なサイズ(1tbでした)とメモリマップを使用して独自のファイルを作成することができます。
最終更新
私は、Windows 7のボックスで同じテストを実行し、私の驚きに、それは何も触れず(システム・ページ・ファイル・サイズまで)一つ一つの時間を動作します。 Windows XPでは、Windows 7よりも大量のメモリ割り当てが頻繁に失敗するというバグだと思います。
唯一の結論は、2GBの4KBページファイルを保持するテーブルが大きすぎてシステムメモリが処理できないため、失敗するということです。 – Chad
これは謎です。どのように多くのプロセスを実行していても、仮想メモリと物理メモリがどれほど大きくても、32ビットWindows上で〜300MBを超えるmemマップファイルを作成することはできません。 –