none
Drawing.Graphic.DrawImageでOut Of MemoryExceptionが出る大きいイメージの条件 RRS feed

  • 質問

  • 他記事を参考にさせていただいております。.net 2.0 Win XP SP3(x86)上での結果で別OSでは試していませんが、

    jpg画像ファイルをDrawing.Bitmapに読み込み、Graphic.DrawImageメソッドのパラメータに渡しています。渡すBitmapが大きいと(jpg9600x9600)だとOut Of MemoryException例外スローとなり描画できません。サイズ9200x9200だと描画できました。単純にwidth heightピクセル値でOut Of MemoryException境界値となるのか、マシンスペックなどにも左右されるのか、情報をいただけたら幸いです。

    Graphic.DrawImageメソッドで例外catchすると、ex.Messageには「メモリ不足です」文字列がセットされましたが、これは何のメモリのことでしょうか?メインメモリ?グラフィックカードのメモリでしょうか?メインメモリは2GBくらいの空きメモリがあっても例外になりました。

    以上、よろしくお願いいたします。


    2011年5月26日 6:05

回答

  • ざっくり10k*10Kの画像とみると、100M*3で300MBの領域が必要になりますね。

    この場合、必要なのは仮想メモリですが、それだけの連続した仮想メモリが32bitプロセスで存在しているかというと、環境によっては厳しいのかもしれませんね。

    vadumpとか実行して仮想メモリの割り当て具合を確認してはどうでしょうか。

     


    jzkey
    • 回答としてマーク 山本春海 2011年6月2日 8:25
    2011年5月26日 12:21
  • どこまでなら安全という境界はありません。
    マシン環境、OS、実行(常駐)しているプロセスなどに依存します。

    すでにアドバイスあるところへの補足ですが、仮想メモリ空間は断片化します。
    また、仮想メモリ空間はどれだけ物理メモリを増設しようと、32bit OS ではユーザが使える領域が MAX 2GB(実質 1.4GB あるかどうか)になります。
    その中で、数百メガバイトの連続領域が空いていないこともあり得ますので、OutOfMemory となるのは仕方がないところかと思います。

    # 感覚的に DrawImage する際は、Bitmap と同じ領域かそれに近い領域のメモリ割り当てが発生すると思っています。
    # 裏付けはありませんが。なので、300MB の連続した空き領域が 2 つぐらいいる計算でしょうか。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク 山本春海 2011年6月2日 8:25
    2011年5月26日 14:42
    モデレータ

すべての返信

  • ざっくり10k*10Kの画像とみると、100M*3で300MBの領域が必要になりますね。

    この場合、必要なのは仮想メモリですが、それだけの連続した仮想メモリが32bitプロセスで存在しているかというと、環境によっては厳しいのかもしれませんね。

    vadumpとか実行して仮想メモリの割り当て具合を確認してはどうでしょうか。

     


    jzkey
    • 回答としてマーク 山本春海 2011年6月2日 8:25
    2011年5月26日 12:21
  • どこまでなら安全という境界はありません。
    マシン環境、OS、実行(常駐)しているプロセスなどに依存します。

    すでにアドバイスあるところへの補足ですが、仮想メモリ空間は断片化します。
    また、仮想メモリ空間はどれだけ物理メモリを増設しようと、32bit OS ではユーザが使える領域が MAX 2GB(実質 1.4GB あるかどうか)になります。
    その中で、数百メガバイトの連続領域が空いていないこともあり得ますので、OutOfMemory となるのは仕方がないところかと思います。

    # 感覚的に DrawImage する際は、Bitmap と同じ領域かそれに近い領域のメモリ割り当てが発生すると思っています。
    # 裏付けはありませんが。なので、300MB の連続した空き領域が 2 つぐらいいる計算でしょうか。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク 山本春海 2011年6月2日 8:25
    2011年5月26日 14:42
    モデレータ
  • jzkey様、Azulean様、早々にコメントありがとうございました。連続した仮想空きメモリ次第ということなのですね。これで例外の「メモリ不足です」の意味が「必要な連続した仮想空きメモリ不足です」だと理解できました。ありがとうございました。

    その後の別環境で試したところ、Win7ではx86/x64共に「メモリ不足です」の例外エラーは出ませんでした。VistaおよびXP x64は未確認です。

    2011年5月27日 6:20