Cenários de uso
- Conversão de documentos com várias páginas e um grande número de páginas. Isso geralmente significa processar livros, relatórios longos, etc. Nesse caso, você pode reconhecer as páginas do documento em paralelo, depois realizar a síntese no processo principal e exportar em paralelo novamente. Também é possível, ao utilizar um pool de Engines, processar vários documentos de múltiplas páginas simultaneamente, mas o consumo de memória pode ser muito alto e até causar erros de “falta de memória”.
- Conversão de uma grande quantidade de documentos de uma única página. É o caso quando você processa faturas, contratos, cartas, etc. O processamento paralelo é mais simples para essa situação, pois documentos de uma única página não dependem uns dos outros e não exigem grandes quantidades de memória ao mesmo tempo.
- Processamento de uma grande quantidade de imagens para buscar informações específicas nelas, ou para trabalhar com os resultados de reconhecimento de alguma outra forma. Pode ser que você não precise converter a maioria delas para um formato editável, portanto a velocidade de síntese e exportação não é um problema. A operação que será executada em múltiplos processos é a iteração pelos blocos de layout e o acesso aos resultados de reconhecimento para blocos de texto.
Se você deseja usar o processamento paralelo para exportação, tenha em mente que esse recurso é compatível apenas com a exportação para PDF (exceto no modo TextOnly) e com os formatos PPTX.
Recomendações e restrições
-
Para o processamento paralelo de documentos com várias páginas, recomendamos o uso do FRDocument. É a forma de multiprocessamento mais fácil de implementar, pois não é necessário implementar interfaces adicionais.
A abertura, o pré-processamento, a análise e o reconhecimento são realizados em paralelo; a síntese do documento é realizada sequencialmente no processo principal e, em seguida, a exportação para PDF (exceto no modo TextOnly) e os formatos PPTX são realizados em paralelo. -
Para processar muitos documentos de uma página recebidos de alguma fonte (como um scanner), recomendamos o BatchProcessor.
A vantagem desse método é que ele pode ser usado quando não se sabe antecipadamente o número de documentos — eles podem ser de tipos diferentes e precisam ser processados à medida que chegam. A desvantagem é que ele exige mais esforço de implementação: é necessário implementar interfaces para um adaptador de arquivo e uma fonte de imagens personalizada.
Todos os estágios de processamento são realizados em paralelo porque, no caso de documentos de uma página, a síntese de página e documento é realizada separadamente para cada página.
A exportação paralela não é compatível com os cenários que utilizam o Batch Processor.
- Para realizar o processamento completo de muitos documentos de uma página em paralelo, você pode usar um pool de Engines carregados fora do processo por meio de COM. Esse método é o mais eficiente em termos de velocidade e elimina automaticamente todas as dificuldades relacionadas ao multithreading: todas as operações com os objetos do ABBYY FineReader Engine são serializadas por meio de COM. No entanto, ele apresenta algumas limitações:
- devido ao uso de COM, é necessário registrar o FREngine.dll;
- se o código estiver escrito em C++, trabalhar com COM exige mais codificação de rotina do que, por exemplo, em C#;
- nesse caso, o processamento ocorre em outro processo, portanto não é possível abrir imagens da memória, e a iteração dos resultados de reconhecimento leva mais tempo porque cada solicitação precisa ser transmitida para outro processo e de volta;
- por fim, carregar várias instâncias do Engine implica maior consumo de memória — especialmente porque, nesse caso, todos os estágios de processamento são realizados em paralelo, e várias operações de síntese simultâneas podem ocorrer ao mesmo tempo, consumindo ainda mais memória.
- Para capturar e tratar os eventos ocorridos durante o processamento paralelo, você pode usar a interface IParallelProcessingCallback. Essa interface pode ser muito útil para gerenciar situações problemáticas. Por exemplo, quando ocorre um erro de timeout, a interface IParallelProcessingCallback oferece diversas soluções para o problema de acordo com as preferências do usuário. Para mais informações, consulte IParallelProcessingCallback::OnWaitIntervalExceeded.
Os eventos ocorridos durante o processamento paralelo de uma página são convertidos em eventos de um documento inteiro.
Resultados dos testes de desempenho
| <br /> | Documentos de uma página | Um documento de múltiplas páginas | Pesquisa nos resultados sem exportação |
|---|---|---|---|
| Processamento sequencial | 60 | 51 | 87 |
| Processamento com FRDocument | 41 | 117 | 57 |
| Processamento com FRDocument (com PageFlushingPolicy = PFP_KeepInMemory) | 55 | 141 | 82 |
| Processamento usando Batch Processor | 99 | 115 | 294 |
| Processamento usando um pool de Engines | 165 | 10 | 102 |
Processamento com o objeto FRDocument
- Defina o valor da propriedade MultiProcessingMode do subobjeto MultiProcessingParams do objeto Engine. O processamento paralelo será utilizado se essa propriedade estiver definida como MPM_Parallel ou MPM_Auto, e tanto o número de páginas do documento quanto o número de núcleos de CPU disponíveis forem maiores que um.
- Ajuste o número de processos a serem executados usando a propriedade RecognitionProcessesCount e especifique os valores das demais propriedades, se necessário.
- AddImageFile, AddImageFileFromMemory, AddImageFileFromStream, AddImageFileWithPassword, AddImageFileWithPasswordCallback
- Preprocess, PreprocessPages
- Analyze, AnalyzePages
- Recognize, RecognizePages
- Process, ProcessPages
- Export, ExportPages, ExportToMemory — somente para exportação para PDF (exceto o modo TextOnly) e para o formato PPTX
Código C#
Código C#
Processamento usando o Batch Processor
- Implemente as interfaces IImageSource e IFileAdapter, que fornecem acesso à fonte de imagens e aos arquivos nela contidos.
- [opcional] Implemente a interface IAsyncProcessingCallback para gerenciar o processamento. Os métodos dessa interface permitem tratar erros e/ou cancelar o processamento.
- [opcional] Configure o multiprocessamento usando o subobjeto MultiProcessingParams do objeto Engine. Observe que não é necessário definir a propriedade MultiProcessingMode, pois o processamento paralelo é usado por padrão ao trabalhar com o Batch Processor. Ajuste o número de processos a serem executados usando a propriedade RecognitionProcessesCount e especifique os valores das demais propriedades, se necessário.
- Chame o método CreateBatchProcessor do objeto Engine para obter o objeto BatchProcessor.
- Chame o método Start desse objeto para inicializar o processor e invocar os processos de reconhecimento assíncronos. É possível especificar a fonte de imagens e passar as referências à interface IAsyncProcessingCallback e aos objetos de parâmetros na chamada a esse método.
- Chame o método GetNextProcessedPage em um loop até que ele retorne 0, o que indica que não há mais imagens na fonte e todas as imagens processadas foram retornadas ao usuário.
Código C#
Código C#
Processamento usando um pool de Engines
Código C#
Código C#
- As permissões de conta podem ser configuradas usando o utilitário DCOM Config (digite DCOMCNFG na linha de comando ou selecione Painel de Controle > Ferramentas Administrativas > Serviços de Componentes). Na árvore do console, localize a pasta Serviços de Componentes > Computadores > Meu Computador > Configuração DCOM, clique com o botão direito em ABBYY FineReader Engine 12.5 Loader (Local Server) e clique em Properties. Uma caixa de diálogo será aberta. Clique na guia Segurança. Em Permissões de Inicialização, clique em Personalizar e, em seguida, clique em Editar para especificar as contas que podem iniciar o aplicativo.
Observe que, em um sistema operacional de 64 bits, o aplicativo DCOM registrado está disponível no console MMC de 32 bits, que pode ser executado usando a seguinte linha de comando:
- Para registrar o FREngine.dll ao instalar seu aplicativo em um computador do usuário final, utilize o utilitário regsvr32. Se você estiver em um sistema operacional de 64 bits, a versão de 64 bits do regsvr32 será executada por padrão. Use a seguinte linha de comando:
- Ao implementar o Engine como um servidor fora do processo, especifique o modo sequencial de processamento de documentos definindo a propriedade MultiProcessingMode do objeto MultiProcessingParams como MPM_Sequential.
