2014-06-13 105 views
-1

這是我轉換圖像的代碼,所有功能/方法都正常工作。轉換圖像時出現內存不足異常

int height=0,width = 0; 
     ImageFormat i; 
     foreach (string pic in files) 
     { 
      Image temp = Image.FromFile(pic); 
      if (whatisformat() != null) 
       i = whatisformat(); 
      else 
       i = GetImageFormat(temp); 
      if (sizeselected()!=-1) 
      { 
       height = sizeselected(); 
       width = getwidth(height); 
      } 
      else 
      { 
       width = temp.Width; 
       height = temp.Height; 
      } 
      Formatresizesave(temp, i, height, width, destination,Path.GetFileName(pic)); 
      progressBar1.Value++; 
     } 
    } 

我一直在得到一個內存不足的例外,雖然我有大量的RAM /內存在我的電腦上。 我的固態硬盤和32GB內存已超過60 GB,但仍然遇到內存不足異常。什麼可能導致問題?在我做的測試中,我只轉換了小於6MB的圖片。 順便說一下,Files是一個包含文件夾中所有文件路徑的列表。 而目標是在別處聲明的全局變量。

+4

你已經嘗試過在圖像上完成後調用'Dispose'?順便說一句,你可以得到'OutOfMemoryException'而不會接近實際的內存限制。 – BradleyDotNET

+0

不,我沒有,我不熟悉Dispose方法..對不起,如果我是「Noob」。我如何調用方法,我應該在哪裏調用它? – Bodokh

+1

這實際上很可能是一個無效的參數,而不是真正的OOM。 GDI +(它是System.Drawing的基礎)喜歡這樣做。例如,如果您的寬度/高度參數爲負值,如果目標/源矩形位於圖像之外,...所有這些都會導致OOM異常。 – CodesInChaos

回答

4

確保您構建的是x64,而不是x86。如果你爲x86構建,你的進程將被限制在2GB內存,而你擁有32GB的物理內存並不重要。您還應該使用using塊的每個圖像Dispose

int height=0,width = 0; 
    ImageFormat i; 
    foreach (string pic in files) 
    { 
     using (Image temp = Image.FromFile(pic)) 
     { 
      if (whatisformat() != null) 
       i = whatisformat(); 
      else 
       i = GetImageFormat(temp); 
      if (sizeselected()!=-1) 
      { 
       height = sizeselected(); 
       width = getwidth(height); 
      } 
      else 
      { 
       width = temp.Width; 
       height = temp.Height; 
      } 
      Formatresizesave(temp, i, height, width, destination,Path.GetFileName(pic)); 
      progressBar1.Value++; 
     } 
    } 
} 
+3

對不起,挑剔,但內存真的不是這裏的重點。 2 GB的限制在地址空間上。不管是由RAM還是磁盤支持,都是重點。 –

+0

@BrianRasmussen硬盤驅動器的虛擬內存回退並不可靠。在大多數系統中,如果您爲x86構建然後嘗試分配3GB的對象,程序將崩潰,因爲分配開始失敗,即使存在可用的8GB RAM。 –

+2

@TimothyShields這是因爲每32位進程只有2-3 GB的用戶模式虛擬地址空間。這些程序因爲耗盡地址空間而崩潰,而不是內存不足。這是布賴恩試圖告訴你的。 – CodesInChaos