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

  • 質問

  • WindowsServer2003を使って6GのRAMを実装していますが、Win32アプリの場合だと4G以上のアドレス空間へアクセスはできないのでしょうか?MapViewOfFileVlmという関数があるようですが、.NET2003では提供されていないようでコンパイルエラーが出てしまいます。また、メモリアロケーションも1G以上確保できないようです。

    実際には1G以上のファイルデータを繰り返し読み込むとキャッシュメモリには展開されているようで、2回目以降のファイルreadでは高速に処理を行ってくれているように見えています。

    どうにかアプリから大きなメモリ空間を操作したいのですが物理的に難しいのでしょうか?

    知っている方がおりましたら教えていただきたいのですが。。。

    2006年3月9日 12:32

すべての返信

  • 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なので普通に使えると思いますけど

    2006年3月9日 13:21
  • ご返信ありがとうございます。

    やはり、無理ですか。。Microsoft社のサイトとかいろいろ見ました。EMA関連も見て、使っているOS(2003ServerStanderdEdition)では無理っぽいようなことも参照していたのですが、「MapViewOfFileVlm」のhelpを見つけ使ってみたもののhelpに記載されている「winbase.h」にエントリがありませんでした。

    VC6の「winbase.h」には確かに「MapViewOfFileVlm」の記載があるのですが、今の環境は.NET2003なので確認しておりません。

    CPUは64BitなのでせめてOSが「X64Edition」なら/WIN64スイッチでいけるのかな?とも思いましたが簡単にはいかないのですね。

     

    8Mの画像ファイルを大量に読み込み、処理を行いたいのですが都度読み込むのではキャッシュ転送?と思われる動作とアプリの競合で出だしの処理がもたつくので、ならばいっそメモリに蓄えてしまえばという発想でRAMを有効活用できないものか?と今回の質問に行き着きました。

    一応マルチスレッドで動作させて実現しようとしておりますがWin32では限界でしょうか?

    (回答に対する再質問となり申し訳ありません。。。)

    2006年3月9日 14:40
  •  会社員 は書きました:

    いたのですが、「MapViewOfFileVlm」のhelpを見つけ使ってみたもののhelpに記載されている「winbase.h」にエントリがありませんでした。

    最新の Platform SDK を導入して、その中を探してみては?

     会社員 は書きました:

    一応マルチスレッドで動作させて実現しようとしておりますがWin32では限界でしょうか?

    工夫の余地が無いとは言いませんが、それだけのデータを素早く扱いたいなら、64bit に移行した方が話が簡単だと思います。

     

    2006年3月9日 15:40
  • 返信ありがとうございます。

     

    2003ServerのSDKに関する情報ありがとうございました。早速入手し確認いたします。

    やはり64Bit移植のほうが手っ取り早いですかぁ。。。。

    残念です。なんとかServerOSだと対応できると思っていたのですが。。。

    ありがとうございます。

     

    2006年3月10日 2:12
  •  会社員 は書きました:

    やはり64Bit移植のほうが手っ取り早いですかぁ。。。。

    「簡単だ」ということです。

    費用はかかりますが、時間も工数かかりません。

    1枚辺り 8MB とは言え、どれくらいの枚数の画像をどのように扱うのか分からないので何ともいえないところではありますが、必ずしも全部をメモリに読む込む必要があるのでしょうか?

    キャッシュ的な機構を盛り込むだけでも大分違ったりはしませんか?

     

    2006年3月11日 6:11
  • 更なるコメントありがとうございます。

    仰せのとおりキャッシュ的な機構を盛り込むことでかなり変わる思います。しかしソフト側からのキャッシュ制御の方法がよくわかっておりません。

     

    上記の方法がわかれば確かにメモリにすべて展開しておく必要はないとい思っております。有効な手法はございますでしょうか?差し支えなければご教示いただけると助かります。

    いろいろお手数をおかけいたしますがよろしくお願いいたします。

     

    2006年3月11日 12:59
  • キャッシュの実装はGoogle先生に聞くほうがいいと思います。

    要はよく利用するものだけを置いておけば言い訳ですから、あなたのシステムのデータのサイズや、傾向に合わせて実装してみては?

    2006年3月11日 14:47
  • 回答ありがとうございます。

     

    Google先生とは検索サイトのGoogleのことでしょうか?(違っていたらすいません)

    キャッシュの実装に関しては検索サイトにても調査してみたいと思います。

    500枚のファイルを繰り返し利用したいのでやはり、毎回ファイルのOpen/Read/Closeの繰り返しで処理を実現する方法をとらざるを得ないかもしれません。

     

    キャッシュの利用方法にて良い方法があれば利用してみます。

     

    度重なる回答誠にありがとうございました。

     

    2006年3月13日 10:24
  • もうこちらをご覧になってないかもしれませんが・・・。

    Win32でもアドレスウィンドウ化拡張を使えば

    4GBを超える領域へのアクセスが可能なようです。

    VirtualAllocやAllocateUserPhysicalPagesを調べてみてください。

    2006年3月16日 4:29
  • すっかり返信が遅くなり申し訳ありません。(といってももう見ていらっしゃらないかも)

     

    情報提供ありがとうございます。

    VirtualAllocについては調べたのですがいまいち使用方法が良くわかりません。

    なお、AllocateUserPhysicalPagesについては調査してみます。

    しばらく忙しくてなかなか調査できませんでしたので再開いたします。

     

    ありがとうございました。

     

    2006年4月19日 8:07