所以,我有一個用C#編寫的應用程序(vs2010),使用tesseract 3.02 dll和Charles Weld的terreract.net包裝器執行OCR。C#可能的內存泄漏?
我想我有一個內存泄漏,它似乎是在Pix對象分配的代碼區域。我正在使用PDF,將其轉換爲灰度PNG,然後將其加載到OCR的Pix對象中。當它工作時,它工作得很好。圖像的尺寸很大(每個暗淡的像素爲5100左右),但尺寸不是很大(只有500k左右)。
我的代碼:
在應用程序啓動初始化引擎:
private TesseractEngine engine = new TesseractEngine(@"./tessdata/", "eng+fra", EngineMode.Default);
方法將PDF轉換爲PNG,然後調用:
,然後調用以下:
// Perform OCR on the image referenced in the Pix object.
private String PerformImageOCR(Pix pixImage)
{
int safety = 0;
do
{
try
{
// Deskew the image.
pixImage = pixImage.Deskew();
//pixImage.Save(@"c:\temp\img_deskewed.png", ImageFormat.Png); // Debugging - verify image deskewed properly to allow good OCR.
string text = "";
// Use the tesseract OCR engine to process the image
using (var page = engine.Process(pixImage))
{
// and then extract the text.
text = page.GetText();
}
return text;
}
catch (Exception e)
{
MessageBox.Show(string.Format("There was an error performing OCR on image, Retrying.\n\nError:\n{0}", e.Message), "Error", MessageBoxButtons.OK);
}
} while (++safety < 3);
return string.Empty;
}
我哈哈我們觀察到創建Pix對象時內存使用量跳過了大約31MB,然後在執行OCR時再次跳轉,然後最終比啓動之前穩定了大約33MB。即:如果應用程序在加載後消耗50MB,則加載Pix對象會導致內存使用量跳至約81MB。執行OCR將會看到它達到114 + MB,然後,一旦過程完成並保存結果,內存使用率將穩定在84MB左右。在文件夾中的許多文件中重複此操作最終會導致應用程序以1.5GB左右的速度消耗掉。
我認爲我的代碼沒問題,但是有些東西是堅持資源的。
tesseract和leptonica dlls是用C編寫的,我已經用VS2010重新編譯了它們以及最新或推薦的圖像庫版本。我不確定的是,如何使用Visual Studio從C#應用程序診斷C DLL中的內存泄漏。如果我使用的是Linux,我會使用valgrind之類的工具來幫助我發現泄漏,但是我在窗口方面的泄漏嗅探技巧令人遺憾缺乏。尋找關於如何進行的建議。
我對這個庫不太熟悉,但'Pix'實現了'IDisposable',如果是的話,你在'pixImage'對象上調用Dispose()嗎?這是我看到的唯一的東西。當然,泄漏可能在圖書館裏。您可能需要聯繫開發人員。另外[.NET內存分析器](http:// stackoverflow。com/questions/3927/what-are-some-good-net-profilers)在幫助識別託管代碼中的泄漏方面非常出色(雖然不太擅長未受管理的泄漏)。 – TypeIA
那麼,哪一位分配非託管資源,是處置還是終止? – Jodrell
感謝@dnvrrs,upvoted你的評論是有幫助的! – Jon