2013-03-19 86 views
1

我需要在短時間內處理很多位圖,並使用線程執行此操作。 現在,我記得關於處理所有這些,我沒有內存泄漏。通常我的應用程序打開幾個線程(我控制它們的數量 - 現在我只能同時執行4個),並且每個處理一個大的位圖並執行一些額外的圖形處理。如何在創建多個位圖時防止內存問題?

一切工作正常,直到我處理讓我說 - 高達100位圖連續。我的應用程序使用opendialog,所以我打開100個第一個位圖,然後我的應用程序自動處理它們。完成後,我打開下一批100個位圖,等等(因此在這些批次之間存在顯着的暫停)。這工作正常。應用程序一直開放。我看到沒有內存泄漏,處理完最後一批後,它保持穩定,我可以處理更多。

當我在單個批次中選擇更多位圖時出現問題 - 超過300個,因此我的應用程序在沒有暫停的情況下處理所有這些位圖。最後,我得到了GDI +內存不足錯誤,我的應用程序掛起了1.7 GB的內存消耗。

我的猜測是系統無法在如此短的時間內釋放內存(並且我的應用程序正在預留更多內存)。可能嗎?如何處理這個?我不想在過程中添加一個愚蠢的延遲。我想管理它。

更新:原因很簡單,該應用程序被錯誤地編譯爲32位,所以只有〜2GB的可用內存。雖然GC需要時間釋放內存,而應用程序仍在爲更多位圖保留更多內容,但應用程序已達到極限並掛起。

我編譯的應用程序爲64位,它的工作完美無瑕。另外我會控制內存的使用,所以它不像現在這樣無人值守。感謝您提出的所有提示和有趣的觀點!

+2

這是很難告訴一些關於它沒有任何代碼,看看你是如何處理圖像.. – 2013-03-19 09:47:57

+1

閱讀本文http://stackoverflow.com/questions/233596/best-practice-for-forcing-garbage- collection-in-c-sharp ...你需要的可能是使用強制垃圾收集來清理... – 2013-03-19 09:48:19

+0

你並行處理了多少位圖? (即你開始多少個任務或線程?)。注:你不*需要強制垃圾回收 - 如果.Net內存不足,它會自動執行。自己去做並不會有任何幫助。 – 2013-03-19 10:29:41

回答

1

取決於你說的「短時間」多長時間,你絕對可以看看Memory Mapped Files。使用它們你大大減少了內存的壓力,並且不會鬆動太多。但是,正如我先說的那樣,這取決於你需要他們處理多快。

所以我肯定會建議看看這個選項,測量並看看它是否適合您的需求。

1

您的應用程序是否編譯爲32位進程?如果是這樣,無論機器有多少內存,2Gb內存都會耗盡。編譯爲64位將允許你充分利用所有的系統內存,並且如果你開始用盡內存,將使用交換空間(這當然會減慢應用程序的速度,但可能是一個更好的解決方案,內存異常)。

+0

肖恩裏德 - 你是對的。我沒有注意到64位版本的編譯器沒有包含在VS的Express版本中,所以我編譯了32位版本,並且在應用程序掛起時的內存使用情況真的如此。我將嘗試在64位編譯器中進行編譯,另外我會嘗試強制垃圾回收器;-) – 2013-03-19 10:36:20

+0

我測試了64位版本 - 完全沒有問題。我在aprox 2 GB內存預留了一個峯值,但是在處理所有圖像後,內存被釋放並且應用程序保持穩定。 – 2013-03-19 15:30:15

相關問題