所以,我有一个用C#编写的应用程序(vs2010),使用tesseract 3.02 dll和Charles Weld的terreract .net包装器执行OCR。
我认为我有内存泄漏,似乎是在分配Pix对象的代码区域。我正在拍摄PDF,将其转换为灰度PNG,然后将其加载到用于OCR的Pix对象中。当它工作时,它的效果非常好。图像尺寸很大(每个暗淡的像素为5100左右),但尺寸不大(仅500k左右)。
我的代码:
应用启动时的Init引擎:
private TesseractEngine engine = new TesseractEngine(@"./tessdata/", "eng+fra", EngineMode.Default);
将PDF转换为PNG的方法,然后调用:
// Load the image file created earlier into a Pix object.
Pix pixImage = Pix.LoadFromFile(Path.Combine(textBoxSourceFolder.Text, sourceFile));
然后调用以下内容:
// 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。即:如果app在加载后消耗50MB,加载Pix对象会导致内存使用率跳至约81MB。执行OCR会看到它达到114 + MB,然后,一旦完成该过程并保存结果,内存使用量将稳定在84MB左右。对文件夹中的许多文件重复此操作最终会导致应用程序以1.5GB左右的频率进行barf消耗。
我认为我的代码没问题,但是有一些东西会占用资源。
tesseract和leptonica dll是用C语言编写的,我已经使用VS2010以及最新或推荐的图像lib版本重新编译它们。我不确定的是,如何使用visual studio从C#app诊断C dll中的内存泄漏。如果我使用的是Linux,我会使用像valgrind这样的工具来帮助我发现漏洞,但是我在窗口方面的泄漏嗅探技巧很遗憾。寻求有关如何进行的建议。
答案 0 :(得分:0)
我不熟悉Tesseract或包装器,但对于内存分析问题,如果您有Visual Studio 2012/2013,则可以使用性能向导。我知道它在Ultimate中可用,但在其他版本上不确定。
您的代码中的某些内容或包装器中的某些内容未正确处理非托管对象。我的猜测就是它在包装器中。运行性能向导或其他C#内存分析器(如JetBrains DotTrace)可能可帮助您对其进行跟踪。
答案 1 :(得分:0)
在这里阅读你的代码我没有看到你在任何地方处理你的pix pixImage?当你处理x图像时,这就是占用所有资源的东西。 在返回字符串结果之前,应该在pixImage上调用dispose方法。这应该会减少程序使用的资源量。