質問者
Win32アプリケーションDLLで4GB以上のメモリ空間をアクセスしたい

質問
-
WindowsServer2003を使って6GのRAMを実装していますが、Win32アプリの場合だと4G以上のアドレス空間へアクセスはできないのでしょうか?MapViewOfFileVlmという関数があるようですが、.NET2003では提供されていないようでコンパイルエラーが出てしまいます。また、メモリアロケーションも1G以上確保できないようです。
実際には1G以上のファイルデータを繰り返し読み込むとキャッシュメモリには展開されているようで、2回目以降のファイルreadでは高速に処理を行ってくれているように見えています。
どうにかアプリから大きなメモリ空間を操作したいのですが物理的に難しいのでしょうか?
知っている方がおりましたら教えていただきたいのですが。。。
すべての返信
-
32bitアプリケーションであればユーザ領域として2GB、/3Gオプションでも3Gしか使えません。
これはWindows 32bitの制限
そのWindows Serverはx64やIA64Editionですか?
もしもそうだったとして、.NET1.1では32bitアプリケーションですから普通のやり方では無理でしょう。
http://www.microsoft.com/japan/developer/library/jpwinpf/_win32_mapviewoffilevlm.htm
これを見る限り、かなり古くからあるAPIなので普通に使えると思いますけど
-
ご返信ありがとうございます。
やはり、無理ですか。。Microsoft社のサイトとかいろいろ見ました。EMA関連も見て、使っているOS(2003ServerStanderdEdition)では無理っぽいようなことも参照していたのですが、「MapViewOfFileVlm」のhelpを見つけ使ってみたもののhelpに記載されている「winbase.h」にエントリがありませんでした。
VC6の「winbase.h」には確かに「MapViewOfFileVlm」の記載があるのですが、今の環境は.NET2003なので確認しておりません。
CPUは64BitなのでせめてOSが「X64Edition」なら/WIN64スイッチでいけるのかな?とも思いましたが簡単にはいかないのですね。
8Mの画像ファイルを大量に読み込み、処理を行いたいのですが都度読み込むのではキャッシュ転送?と思われる動作とアプリの競合で出だしの処理がもたつくので、ならばいっそメモリに蓄えてしまえばという発想でRAMを有効活用できないものか?と今回の質問に行き着きました。
一応マルチスレッドで動作させて実現しようとしておりますがWin32では限界でしょうか?
(回答に対する再質問となり申し訳ありません。。。)