我有一個應用程序,它處理和重新大小的圖像,並偶爾在長時間迭代我得到OutOfMemoryException異常。內存不足異常System.Drawing.Image.FromStream()
我將我的圖像作爲文件流存儲在數據庫中,在處理過程中我需要將它們保存到臨時物理位置。
我的模型:
[Table("Car")]
public class Car
{
[... some fields ...]
public virtual ICollection<CarPhoto> CarPhotos { get; set; }
}
[Table("CarPhoto")]
public class CarPhoto
{
[... some fields ...]
public Guid Key { get; set; }
[Column(TypeName = "image")]
public byte[] Binary { get; set; }
}
處理看起來大致是這樣的:
foreach (var car in cars)
{
foreach (var photo in car.CarPhotos)
{
using (var memoryStream = new MemoryStream(photo.Binary))
{
using (var image = Image.FromStream(memoryStream)) // this is where the exception is thrown
{
var ratioX = 600.00/image.Width;
var newWidth = (int)(image.Width * ratioX);
var newHeight = (int)(image.Height * ratioX);
using (var bitmap = new Bitmap(newWidth, newHeight))
{
Graphics.FromImage(bitmap).DrawImage(image, 0, 0, newWidth, newHeight);
bitmap.Save(directory + filePath);
}
}
}
}
}
我已經看了this類似的線程,但沒有一個答案似乎我的情況下適用。
其中一個答案建議使用Image.FromStream(),但這正是我所做的。
我非常有信心,我的所有圖片都是有效的。異常似乎是隨機發生的,大多數情況下是處理較大的文件,但它也適用於較小的文件。有時候一個圖像會失敗,但下次處理會很好。
就我所見,我正確地處理了一切(內存流,圖像和位圖)。
這個工作正在被Hangfire激怒。這可能會導致問題嗎?
我想你需要讓自己熟悉windbg並分析故障轉儲以找到解決方案。 – weismat
處理前請勿將所有圖像加載到內存中。 FILESTREAM存儲的優點是您可以取回流而不是BLOB。使用SqlFileStream一次加載和處理一個圖像。 –
Graphics對象也需要處理,使用*使用*就像您對其他對象所做的一樣。這並不能解決問題,並且由於地址空間碎片導致程序無法正常工作,因此位圖非常困難,因爲它們通常非常大。強烈建議在64位模式下運行此代碼。如果這不是一個選項,那麼重新使用MemoryStream對象,而不是重複重新創建它將是明智的。 –