2015-10-26 84 views
0

我已經繼承了一個網站,這是一個過大的和未壓縮的圖像困擾,所以我正在自動糾正它的任務,除了超過一定大小的文件,其中主要工作。例如,我有一個8176x6132 300dpi和24位深度的JPG圖像,文件大小爲4.49mb。ImageResizer內存不足大圖像異常

這裏是我的ImageJob

var instructions = new Instructions("width=1920;height=0;mode=max"); 
var resizedImg = new ImageJob(filePath, filePath, instructions).Build(); 

我有足夠的可用資源,我的機器上還沒有走出內存異常。正如我現在測試,我有90%的CPU免費和51%的內存。

我的機器有:

  • 英特爾CoreTMi7四核處理器i7-4790(3.6GHz的),8MB緩存
  • 16GB金士頓DUAL-DDR3 1600MHz的

爲什麼會失敗?當我運行ImageJob時,內存使用率在失敗之前沒有增加(據我所知)。

我使用ImageResizer 3.4.3和DiskCache插件。

我還應該注意到,我可以在Photoshop中打開問題文件,沿着長邊調整爲3000px,保存然後運行相同的ImageJob,然後完成而不會出錯。

Diagnostics page output and exception stack trace

+0

爲什麼高度爲'0'?這可能是罪魁禍首。所以首先要看看,確保你有正確的輸入參數進入'System.Drawing.Graphics.DrawImage'調用。 –

+0

Oops ImageResizer是第三方庫,但是它是開源的,因此您可以逐步執行代碼以確保它將合理的值傳遞給'System.Drawing'。或者,詢問他們的支持,這足夠奇怪地指向SO,它是如何遞歸的。 –

+0

我不知道ImageResizer是用來做什麼的,但如果它是System.Drawing或WPF,你可能會考慮切換到使用ImageMagick的東西。由於圖像調整大小的內存要求,我發現產生一個圖像魔法過程可以爲您自己的過程提供一定程度的獨立於任意大圖像的危險。 – spender

回答

1

首先,運行在64位模式,而不是32的進程,將在定位所需的150MB,62MB,12MB和連續的存儲器塊這樣更好的機會。如果您觸發後備代碼路徑,或者圖像是CMYK jpeg(普通)或有問題,則可能還需要另外200mb。

其次,由於您沒有使用URL API,請確保您限制了要處理的併發圖像的數量。在ImageResizer v3中,一次執行1或2個操作。

三,升級到v4並使用FastScaling插件。 You'll get actual concurrency,大塊RAM將保存較少的時間,這意味着您的吞吐量很容易在這個大文件上增加10倍。

+0

首先感謝大家關於64位模式,我不知道我必須明確地將我的Visual Studio安裝程序更改爲在64位計算機上使用64位,每天的上學日!僅憑這種改變,我現在可以處理剩餘的大圖像。謝謝 – ProNotion