Не могу разобраться почему утекает память в приложение (winform, .net). Использую для распознава́ния текста GdPicture.Net, за один цикл (около 200 вызовов функции из GdPicture.dll) в целом прирастает на 20 Мб. Вот данные с профилировщика VisualStudio. первый момент времени и второй.
Функция с выделением наибольший памяти выглядит вот так(никак)
Куда копать не знаю, в коде вроде бы работаю аккуратно, везде где нужно реализовал интерфейс IDisposable. Даже не знаю что конкретно выложить из кода, для того чтобы разобраться. Буду рад любой помощи.
public class OCRReader : IDisposable
{
private GdPictureImaging oGdPictureImaging = new GdPictureImaging();
private int m_ImageID;
//[System.Runtime.InteropServices.DllImport("shell32.dll", EntryPoint = "ShellExecuteA")]
//private static extern int ShellExecute(int hwnd, string lpOperation, string lpFile, string lpParameters, string lpDirectory, int nShowCmd);
public void Dispose()
{
if (oGdPictureImaging == null)
return;
oGdPictureImaging.OCRTesseractClear();
oGdPictureImaging.Dispose();
}
public string ImageProccessing(int sourceX, int sourceY, int distinationX, int distinationY, int quality, bool saveImg = false, string name = "Empty")
{
try
{
LicenseManager oLicenceManager = new LicenseManager();
oLicenceManager.RegisterKEY("0429254382496276761391972");
using (MemoryStream memory = new MemoryStream())
{
using (Bitmap bmp = new Bitmap(distinationX, distinationY))
{
Rectangle rect = new Rectangle(sourceX, sourceY, distinationX, distinationY);
Graphics graphics = Graphics.FromImage(bmp as Image);
graphics.CopyFromScreen(rect.Left, rect.Top, 0, 0, bmp.Size);
bmp.Save(memory, ImageFormat.Jpeg);
if (memory != null)
{
if (GdPictureDocumentUtilities.GetDocumentFormat(memory) == DocumentFormat.DocumentFormatPDF)
{
GdPicturePDF oPDF = new GdPicturePDF();
if (oPDF.LoadFromStream(memory) == GdPictureStatus.OK)
{
m_ImageID = oPDF.RenderPageToGdPictureImageEx(200, true);
if (m_ImageID == 0)
return "File could not be loaded. Error: " + oPDF.GetStat().ToString();
oPDF.CloseDocument();
}
}
else
{
m_ImageID = oGdPictureImaging.CreateGdPictureImageFromStream(memory, DocumentFormat.DocumentFormatJPEG);
if (m_ImageID == 0)
return "Image could not be loaded. Error: " + oGdPictureImaging.GetStat().ToString();
}
}
if (oGdPictureImaging.Scale(m_ImageID, quality, System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic)
!= GdPictureStatus.OK)
return "Error: " + oGdPictureImaging.GetStat().ToString();
string sOCR = null;
int ncpt = 0;
int LeftArea = 0; int TopArea = 0;
OCRContext context = OCRContext.OCRContextSingleLine;
oGdPictureImaging.OCRTesseractSetOCRContext(context);
if (oGdPictureImaging.OCRTesseractReinit() != GdPictureStatus.OK)
{
return "Error" + " " + oGdPictureImaging.GetStat().ToString();
}
sOCR = oGdPictureImaging.OCRTesseractDoOCR(m_ImageID, "eng", "OCR\\", "");
if (oGdPictureImaging.GetStat() == GdPictureStatus.OCRDictionaryNotFound)
{
return "Needed dictionary is not into the specified path!";
}
else
{
oGdPictureImaging.OCRTesseractClear();
oGdPictureImaging.ClearGdPicture();
return sOCR;
}
}
}
}
catch
{
return string.Empty;
}
}}
Ну и вызов пусть примерно вот так проходит
using (OCRReader ocr = new OCRReader())
{
for (int i = 0; i < 100; i++)
{
var val0 = ocr.ImageProccessing(100+i, 292, 53, xdestination, 220);
}
}
Касательно этого примера, чем больше i, тем больше памяти выделяется за один цикл.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Всем доброго времени сутокНеделю назад начал писать большой проект на С#
Начал изучать MVVM и столкнулся с недопониманиемНапример чтобы записать данные из ViewModel во View , необходимо их заполнить в конструкторе ViewModel()