Pular para o conteúdo principal
Se você processa grandes volumes de documentos, o OCR (Optical Character Recognition) pode exigir muito poder de processamento. Muitas vezes, faz sentido usar sistemas com várias CPUs para aumentar a velocidade de processamento, e o ABBYY FineReader Engine oferece várias maneiras de aproveitar os recursos de multiprocessamento da sua configuração de hardware. Esta seção descreve os possíveis cenários de uso e fornece recomendações sobre como escolher o modo de multiprocessamento mais adequado para a sua tarefa, juntamente com estatísticas de teste. Também há links para os exemplos de código, que fornecem implementações de multiprocessamento. Para usar multiprocessamento, você precisa definir a propriedade MultiProcessingParams do objeto Engine com os valores adequados. O ABBYY FineReader Engine oferece suporte a dois objetos diferentes que disponibilizam multiprocessamento a partir de uma única instância do Engine. Eles são o objeto FRDocument (consulte Processamento com o objeto FRDocument) e o objeto BatchProcessor (consulte Processamento usando o Batch Processor).
Tenha em mente que o processamento paralelo exige mais RAM do que o processamento sequencial. A recomendação geral para uma estação de trabalho é 350 MB * (número de núcleos) + 450 MB de RAM e, se você estiver processando documentos em árabe ou idiomas CJK — 850 MB * (número de núcleos) + 750 MB de RAM.

Cenários de uso

Vamos partir do pressuposto de que você está processando muitos documentos. Mas também precisamos levar em conta os resultados que deseja obter e escolher a melhor forma de implementar sua tarefa. Os diferentes cenários a considerar são:
  • Conversão de documentos multipágina com um grande número de páginas. Em geral, isso 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. Ao usar um pool de Engines, você também pode processar vários documentos multipágina simultaneamente, mas o consumo de memória pode ser enorme e até levar a erros de “out of memory”.
  • Conversão de um grande número de documentos de uma página. Esse é o caso quando você processa faturas, contratos, cartas etc. O processamento paralelo é mais simples nessa situação, pois documentos de uma página não dependem uns dos outros e não exigem grande quantidade de memória ao mesmo tempo.
  • Processamento de um grande número de imagens e busca nelas por informações necessárias ou uso dos resultados de reconhecimento de alguma outra forma. Talvez você não precise converter a maioria delas para um formato editável, portanto a velocidade da síntese e da exportação não é um problema. A operação que será executada em vários processos consiste em percorrer os blocos de layout e acessar os resultados de reconhecimento dos blocos de texto.
Se você quiser usar processamento paralelo para exportação, tenha em mente que esse recurso é compatível apenas com exportação para os formatos PDF (exceto o modo TextOnly) e PPTX.

Recomendações e restrições

  • Para o processamento paralelo de documentos com várias páginas, recomendamos usar o FRDocument. Essa é a forma de multiprocessamento mais fácil de implementar, porque você não precisa 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 para o formato PPTX é realizada 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 você não sabe antecipadamente o número de documentos; eles podem ser de tipos diferentes e precisam ser processados assim que chegam. A desvantagem é que ele exige mais esforço de implementação: você precisa implementar interfaces para um adaptador de arquivos e uma fonte personalizada de imagens.
    Todos os estágios de processamento são executados em paralelo porque, no caso de documentos de uma página, a síntese da página e a do documento são realizadas separadamente para cada página.
A exportação paralela não tem suporte em cenários com o Batch Processor.
Para capturar e tratar os eventos que ocorrem 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 tempo limite, a interface IParallelProcessingCallback oferece várias soluções para o problema, dependendo das preferências do usuário. Para mais informações, consulte IParallelProcessingCallback::OnWaitIntervalExceeded.
Os eventos que ocorrem durante o processamento paralelo de uma página são convertidos em eventos do documento como um todo.

Processamento com o objeto FRDocument

O número de processos a serem executados é detectado automaticamente, com base no número de núcleos de CPU físicos ou lógicos disponíveis, no número de núcleos de CPU livres permitidos pela licença e no número de páginas do documento. Para ativar o modo de multiprocessamento, faça o seguinte:
  1. Defina o valor da propriedade MultiProcessingMode do subobjeto MultiProcessingParams do objeto Engine. O processamento paralelo é usado se essa propriedade estiver definida como MPM_Parallel ou MPM_Auto, e se o número de páginas do documento e o número de núcleos de CPU disponíveis forem ambos maiores que um.
  2. Ajuste o número de processos a serem executados usando a propriedade RecognitionProcessesCount e, se necessário, especifique os valores de outras propriedades.
Após configurar as definições de multiprocessamento, você pode usar o procedimento padrão para trabalhar com FRDocument. O ABBYY FineReader Engine iniciará automaticamente vários processos de reconhecimento quando você chamar um dos seguintes métodos do objeto FRDocument: Para cada página do documento, uma nova tarefa de processamento é criada, e essa tarefa é atribuída a um dos processos de reconhecimento. Quando um processo de reconhecimento conclui a tarefa, ele recebe a próxima tarefa de processamento. Isso continua até que todas as tarefas sejam processadas.

Processamento com Batch Processor

Quando o Batch Processor é inicializado, processos assíncronos de reconhecimento são invocados e configurados. Em seguida, o processador obtém arquivos de imagem de uma fonte de imagens personalizada. Para cada página do arquivo de imagem, uma nova tarefa de processamento é criada, e essa tarefa é encaminhada para um dos processos de reconhecimento. Se todas as tarefas de um arquivo já tiverem sido encaminhadas para processamento, mas nem todos os processos de reconhecimento estiverem ocupados, o próximo arquivo de imagem da fila de imagens da fonte será obtido e encaminhado para processamento. Isso é feito até que a primeira página de imagem tenha sido convertida e entregue ao usuário. As páginas são retornadas ao usuário na ordem em que foram obtidas da fonte de imagens. Para organizar o multiprocessamento com o Batch Processor, faça o seguinte:
  1. Implemente as interfaces IImageSource e IFileAdapter, que fornecem acesso à fonte de imagens e aos arquivos nela contidos.
  2. [opcional] Implemente a interface IAsyncProcessingCallback para gerenciar o processamento. Os métodos dessa interface permitem tratar erros e/ou cancelar o processamento.
  3. [opcional] Configure o multiprocessamento usando o subobjeto MultiProcessingParams do objeto Engine. Observe que não é necessário definir a propriedade MultiProcessingMode, porque o processamento paralelo é usado por padrão ao trabalhar com Batch Processor. Ajuste o número de processos a serem executados usando a propriedade RecognitionProcessesCount e especifique os valores de outras propriedades, se necessário.
  4. Chame o método CreateBatchProcessor do objeto Engine para obter o objeto BatchProcessor.
  5. Chame o método Start desse objeto para inicializar o processador e invocar processos assíncronos de reconhecimento. Você pode especificar a fonte de imagens e passar as referências para a interface IAsyncProcessingCallback e para os objetos de parâmetros na chamada a esse método.
  6. Chame o método GetNextProcessedPage em um loop até que o método retorne 0, o que significa que não há mais imagens na fonte e que todas as imagens processadas já foram retornadas ao usuário.
A página retornada pelo método GetNextProcessedPage existe até a próxima chamada desse método. Portanto, se você quiser salvar essa página, deverá salvá-la usando os métodos do objeto FRPage ou adicioná-la a um documento existente usando o método IFRDocument::AddPage ANTES da próxima chamada do método GetNextProcessedPage.
O pacote de distribuição do ABBYY FineReader Engine inclui o exemplo BatchProcessing, que mostra como usar o Batch Processor.

Veja também

FRDocument BatchProcessor MultiProcessingParams Percorrendo as páginas do documento