簡體   English   中英

在目標為AnyCPU的.NET中打開大PNG會拋出內存不足異常

[英]Opening Large PNG in .NET Targeting AnyCPU Throws Out of Memory Exception

我正在嘗試以8,733 x 12,945像素的代碼打開PNG圖像。 根據我的計算,這需要431.247 MiB(8733 * 12945 * 4)的內存來存儲像素。 但是,當我的構建平台是AnyCPU時,任何從C#打開文件的嘗試(使用new Bitmap(string filename) )都會導致OutOfMemoryException。 當我將平台切換到x64時,圖像打開沒有問題。

有誰知道為什么我要嘗試打開一個比2 GiB(2 ^ 31)閾值要少得多的內存的圖像而得到這樣的異常?

-開始編輯-

是的,我知道內存碎片的概念。 我只有一個WebForm,並且一旦客戶端從文件選擇器對話框中選擇了文件,它所要做的唯一操作就是調用新的位圖。 我的期望是該應用程序執行以下操作:

1)為Windows窗體分配足夠的內存(為了安全起見,將其分配給20kB)2)用戶選擇一個文件,因此該應用打開了一個流(可能為8kB緩沖區)並讀取了標頭信息(前幾百個字節)。 3)標頭指示圖像大小和像素格式,因此構造函數將分配一個足以容納像素的緩沖區(450 MB)。

我知道我的內存非常零散,或者GDI +試圖以一種奇怪的方式分配空間。 我不明白的是為什么會這樣? 我的應用程序中沒有資源密集型的事情,因此內存的碎片不應足夠分散,以防止分配約20%的可尋址空間。 有什么可能阻止這種分配? 位圖構造函數是否需要比我計算的更多的內存?

您應該使用流來讀取大文件。 此異常與可用物理內存量無關。 如果您需要更多信息,則應閱讀以下文章: http : //blogs.msdn.com/b/ericlippert/archive/2009/06/08/out-of-memory-does-not-refer-to-physical -memory.aspx

暫無
暫無

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

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