簡體   English   中英

在單個app實例中加載大量位圖時WPF內存不足異常。有限制嗎?

[英]WPF out of memory exception when loading large amount of bitmaps in single instance of app. Is there a limit?

我需要將大量位圖加載到內存中以便在WPF應用程序中顯示(使用.net 4.0)。 我遇到麻煩的地方是當我接近大約1,400MB的內存時(我從任務管理器的進程列表中得到這個)。

無論應用程序是在具有4GB內存還是6GB的計算機上運行(以及其他一些我沒有詳細說明的配置),都會發生同樣的事情。 通過減少加載的圖像以及它在1台機器上工作時很容易進行測試,然后它可以對它們進行全部工作,但是當它在一台機器上崩潰時它也可以在所有機器上運行。

當我減少圖像數量並允許應用程序加載而不會導致內存異常時,我可以運行應用程序的多個實例(超過單個實例的1.4GB)而沒有問題所以它似乎是每個實例限制或每個實例我的錯誤。

我將圖像作為BitmapImage加載,它們或者存儲在List<BitmapImage>或者加載到List<byte[]>中,稍后在一堆分層序列中使用它們(使用Writeablebitmap

當我在使用中加載圖像時發生錯誤。 在可重復的情況下,我加載了600個640X640圖像以及另外200-300個較小的圖像,范圍從100X100到200X200,盡管它似乎是一個整體位計數問題。

所以我的問題是:

*在這種情況下,是否有一些內置的進程內存限制?

*是否有更好的技術將大量圖像數據加載到內存中?

謝謝,Brian

是的,每個進程內存分配有一個限制。 其中一個解決方案是使您的二進制LARGEADDRESSAWARE耗盡更多內存。

請參考內存不足? 增加程序可用內存的簡便方法 ,它圍繞解決方案進行了很好的討論。

以下可能是一個原因,但我不確定

問題不在於加載大量數據,而是因為CLR為大於85k內存的對象維護了一個大堆,並且你沒有任何控制來釋放這個大堆。

並且這些對象變為Long Lived,並且在Appdomain Unloads時通常會釋放。

我建議嘗試在另一個AppDomain中加載更大的圖像,並使用該appdomain來處理更大的圖像。

請參閱此MSDN Entry to Profiling GC

如果使用.net 4.0,請查看內存映射文件是否有幫助

還有更多的例子

x86構建可以在64位Windows上訪問4 GB,因此這是該過程的理論上限。 這要求應用程序具有大地址感知能力 此外,.NET對單個對象施加了2 GB的限制。

您可能患有LOH碎片。 大對象堆上存儲的對象大於85000字節,這是托管堆的一個特殊部分,不會被壓縮。

你說圖像是600x600,但像素格式是什么,還有面具嗎? 如果每個顏色通道使用一個字節加上alpha通道的一個字節,則每個圖像為600x600x32,因此在32位進程中嘗試一次加載600個將是一個問題。

您遇到了限制32位進程,只能訪問大約2Gb的數據。 如果你要運行64位,你就不會有問題。 有很多方法可以解決這個問題,其中一些方法是:

  • 只需不加載那么多數據,只在需要時加載。 使用緩存。
  • 使用內存映射文件將整個數據塊映射到內存中。 不推薦,因為您必須自己進行所有內存管理。
  • 使用多個進程來保存數據並使用IPC機制僅提供所需的數據,類似於第1項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM