none
out of memory發生的原因? RRS feed

  • 問題

  • Dear all,
       我有隻應用程式,因為需要大量的計算並儲存大量圖檔在記憶體中。
    當這隻程式所使用的記憶體大於約1g以上時,常會發生out of memory的例外。
    據我所知,32位元的系統,單1隻應用程式所能使用的記憶體為1g,
    不知道我的這個例外是不是這個原因造成的。
    OS: XP SP3
    RAM: 4G
    IDE: VS2008 C#
      發生例外的情況,通常總記憶體使用量都不到2g,而此程式所佔的記憶體就1g以上。
    PS:不可能將圖檔儲到hd,再load出來算,因為圖檔是由Camera來的,且效能是重要的考量。

    謝謝
           Howard
    2009年4月1日 上午 08:13

解答

  • 32位元"理論上"最高可以到2Gb, 但是在實際執行上, 大概在1.4~1.6GB就會報OOM, 而且您的OS以及電腦上的其他程式
    也需要記憶體,記憶體的使用上有不足的情況發生,  如果情況允許, 建議您加記憶體.


    微軟技術支援中心(CSS) - http://twitter.com/msdn_taiwan
    • 已標示為解答 Lolota Lee 2009年4月8日 上午 07:11
    2009年4月2日 上午 08:01
  • HI,

    32-bits的.NET平台, 程式可以使用的連續記憶體空間最高上限為2GB, 扣除已使用的記憶體, 通常無法真的要到2GB的完整空間, 建議改用unsafe的方式進行記憶體配置和圖檔處理, 或是改用64-bits的.NET平台, 請參考:Unsafe Image Processing
    • 已標示為解答 Lolota Lee 2009年4月8日 上午 07:11
    2009年4月3日 上午 02:51

所有回覆

  • HI,

    您可以呼叫物件的Close方法, Dispose方法, 關閉和丟棄不再用到物件, 如果還是會發生記憶體不足的情形, 可以考慮呼叫GC.Collect方法, 利用這些方法能夠降低程式執行發生記憶體不足的機會
    2009年4月2日 上午 01:18
  • Hi tihs,
         您提到的方式我都有做了,主要是因為這些影像的資料實在太大了,所以才會佔這麼大的記憶體空間。
    我主要想確認的事,是否真的32位元的系統,單一程式最大只能使用1g的記憶體空間。
    謝謝

            Howard
    2009年4月2日 上午 02:41
  • 圖是由Camera來的,你的是那一台,現在的DSRL最高不是到30M像素?
    那麼大的圖一定要裁切的.
    2009年4月2日 上午 03:26
  • Camera是工業用的,不是一般的相機唷。
    每一張圖都存在需要的影像,裁了就少東西了。所以沒辨法裁的。
    謝謝。
    2009年4月2日 上午 07:04
  • 32位元"理論上"最高可以到2Gb, 但是在實際執行上, 大概在1.4~1.6GB就會報OOM, 而且您的OS以及電腦上的其他程式
    也需要記憶體,記憶體的使用上有不足的情況發生,  如果情況允許, 建議您加記憶體.


    微軟技術支援中心(CSS) - http://twitter.com/msdn_taiwan
    • 已標示為解答 Lolota Lee 2009年4月8日 上午 07:11
    2009年4月2日 上午 08:01
  • 感謝Geek的回覆。
    不過我的記憶體總共插了4g,總共使用量也不到2g就出現這個例外了。
    只是我的程式的使用量就1g以上了,所以我才不知道是怎麼回事。
    若照您說的,大概在1.4~1.6GB就會報OOM,那可能性就非常的大了。
    感謝您的回覆。

                   Howard
    2009年4月2日 上午 11:00
  • 我想先不要去管實體記憶體的問題!
    應該從演算法去研究.
    1G的記憶體對程式而已經很大了.
    假如1G會爆,你裝個2G,4G 也是有可能會爆.
    2009年4月3日 上午 12:53
  • 如果你是要做影像處理的話,你可以像Directx或一些遊戲或影像處理引擎一樣.將圖形切割,只將要處理的部分載入跟即將要處理的部分載入Buffer.
    2009年4月3日 上午 12:57
  • HI,

    32-bits的.NET平台, 程式可以使用的連續記憶體空間最高上限為2GB, 扣除已使用的記憶體, 通常無法真的要到2GB的完整空間, 建議改用unsafe的方式進行記憶體配置和圖檔處理, 或是改用64-bits的.NET平台, 請參考:Unsafe Image Processing
    • 已標示為解答 Lolota Lee 2009年4月8日 上午 07:11
    2009年4月3日 上午 02:51