Растет потребление памяти

335
08 сентября 2017, 19:35

Не могу разобраться почему утекает память в приложение (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, тем больше памяти выделяется за один цикл.

READ ALSO
Правильное оформление проекта [требует правки]

Правильное оформление проекта [требует правки]

Всем доброго времени сутокНеделю назад начал писать большой проект на С#

256
Изменение данных в потоке

Изменение данных в потоке

Начал изучать MVVM и столкнулся с недопониманиемНапример чтобы записать данные из ViewModel во View , необходимо их заполнить в конструкторе ViewModel()

283
Что такое Claims и как они работают ?

Что такое Claims и как они работают ?

Какое практическое примение Claims в AspNet Identity

262