Утечка памяти MODI

У меня есть приложение, в котором я использую MODI 2007 для распознавания нескольких многостраничных файлов TIFF. Я обнаружил, что когда я начинаю это с каталога, который содержит несколько хороших, но также и некоторые размолвки, которые нельзя открыть в Windows Picture and Fax Viewer, тогда MODI также не может распознать эти «плохие» размолвки. Когда это происходит, приложение не может освободить какую-либо память, которая использовалась MODI для распознавания этих размолвок. После того, как инструмент пытается распознать слишком много таких «плохих» размолвок, машине не хватает памяти, и приложение дает сбой. Я пробовал несколько исправлений кода из Интернета, которые предположительно исправляют любые утечки памяти MODI, но пока ни один из них у меня не сработал. Я вставляю часть кода ниже, которая выполняет распознавание текста:

                StringBuilder strRecText = new StringBuilder(10000);

                MODI.Document doc1 = new MODI.Document();

                doc1.Create(name);
                try
                {
                    doc1.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);  // this will ocr all pages of a multi-page tiff file
                }
                catch (Exception e)
                {
                    doc1.Close(false); // clean up
                    if (doc1 != null)
                    {
                        GC.Collect();
                        GC.WaitForPendingFinalizers();
                        GC.Collect();
                        GC.WaitForPendingFinalizers();


                        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(doc1);
                        doc1 = null;
                    }

                }

                MODI.Images images = doc1.Images;
                for (int imageCounter = 0; imageCounter < images.Count; imageCounter++)
                {
                    if (imageCounter > 0)
                    {
                        if (!noPageBreakFlag)
                        {
                            strRecText.Append((char)pageBreakChar);
                        }
                    }

                    MODI.Image image = (MODI.Image)images[imageCounter];
                    MODI.Layout layout = image.Layout;
                    strRecText.Append(layout.Text);

                    GC.Collect();
                    GC.WaitForPendingFinalizers();
                    GC.Collect();
                    GC.WaitForPendingFinalizers();

                    if (layout != null)
                    {
                        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(layout);
                        layout = null;
                    }
                    if (image != null)
                    {
                        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(image);
                        image = null;
                    }

                }

                File.AppendAllText(ocrFile, strRecText.ToString());     // write the OCR file out to disk

                GC.Collect();
                GC.WaitForPendingFinalizers();
                GC.Collect();
                GC.WaitForPendingFinalizers();

                if (images != null)
                {
                    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(images);
                    images = null;
                }

                GC.Collect();
                GC.WaitForPendingFinalizers();
                GC.Collect();
                GC.WaitForPendingFinalizers();

                doc1.Close(false); // clean up
                if (doc1 != null)
                {
                    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(doc1);
                    doc1 = null;
                }

                GC.Collect();
                GC.WaitForPendingFinalizers();
                GC.Collect();
                GC.WaitForPendingFinalizers();

person Khragg    schedule 22.04.2010    source источник


Ответы (1)


Последние несколько месяцев я работал над проектом с использованием MODI. MODI, безусловно, был самым точным движком OCR, который я пробовал, но у него есть некоторые серьезные проблемы с высвобождением ресурсов и сбоями.

В итоге я создал приложение командной строки, которое принимает путь к изображению в качестве параметра командной строки, затем сохраняет полученный текст в файл и завершает работу. Затем я использую это приложение командной строки с любым программным обеспечением, которое требует функциональности modi. Это звучит как странное решение, но это очень простой и понятный способ решить проблемы с утечкой памяти, которые возникают в MODI, потому что, когда существует процесс командной строки, его память освобождается операционной системой, поэтому вам не нужно беспокоиться о сбое вашего приложения или ресурсы не очищаются. Я обнаружил, что время, необходимое для запуска exe из командной строки и последующего чтения файла, который он создает, весьма незначительно по сравнению со временем, которое требуется для фактического распознавания текста изображения, поэтому вы на самом деле не сильно теряете в производительности.

person Jeremy    schedule 12.11.2010