MODI утечка памяти - PullRequest
       15

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

0 голосов
/ 22 апреля 2010

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

                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();

1 Ответ

1 голос
/ 12 ноября 2010

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

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

...