2010-04-22 27 views
0

J'ai une application où j'utilise MODI 2007 à OCR plusieurs fichiers tiff multi-page. J'ai trouvé que quand je le lance sur un répertoire qui contient plusieurs bons tiffs mais aussi quelques tiffs qui ne peuvent pas être ouverts dans Windows Picture et Fax Viewer, alors MODI échoue également à OCR ces "mauvais" tiffs. Lorsque cela se produit, l'application est incapable de récupérer toute la mémoire qui a été utilisée par MODI pour OCR ces tiffs. Une fois que l'outil a tenté d'effectuer une ROC trop importante de ces «mauvais» tiffs, la machine manque de mémoire et l'application se bloque. J'ai essayé plusieurs correctifs de code sur le web qui prétendument réparer les fuites de mémoire MODI, mais jusqu'à présent, aucun n'a fonctionné pour moi. Je suis coller dans la partie du code ci-dessous qui fait l'après ROC:MODI fuite de mémoire

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

Répondre

1

Je travaille sur un projet en utilisant MODI pour les derniers mois. MODI a de loin été le moteur OCR le plus précis que j'ai essayé, mais il a quelques problèmes majeurs libérant des ressources et se brisant.

J'ai fini par construire une application en ligne de commande qui prend le chemin d'une image en tant que paramètre de ligne de commande, puis enregistre le texte résultant dans un fichier et se ferme. J'utilise ensuite cette application en ligne de commande par tout logiciel qui nécessite des fonctionnalités modi. Cela ressemble à une solution étrange mais c'est un moyen très simple et direct de résoudre les problèmes de fuite de mémoire que MODI a parce que lorsque le processus de ligne de commande existe, sa mémoire est libérée par le système d'exploitation. les ressources ne sont pas nettoyées. J'ai trouvé que le temps qu'il faut pour lancer l'exe de ligne de commande, puis lire le fichier qu'il crée est assez insignifiant par rapport au temps qu'il faut pour réellement OCR l'image, de sorte que vous ne perdez pas beaucoup de performance.