跳转到主要内容
如果您需要处理大量文档,OCR 往往会占用大量处理资源。为提高处理速度,通常适合使用多 CPU 系统,而 ABBYY FineReader Engine 提供了多种方式来利用硬件配置中的多进程能力。 本节概述了可能的使用场景,并结合测试统计数据,就如何为您的任务选择合适的多进程模式提供建议。此外,还提供了代码示例的链接,这些示例展示了多进程的实现方法。 要使用多进程,您需要将 Engine 对象的 MultiProcessingParams 属性设置为适当的值。 ABBYY FineReader Engine 支持两种不同的对象,可通过单个 Engine 实例实现多进程处理。它们分别是 FRDocument 对象 (请参见使用 FRDocument 对象进行处理) 和 BatchProcessor 对象 (请参见使用 Batch Processor 进行处理) 。
请注意,并行处理比顺序处理需要更多 RAM。对于工作站,通常建议的内存配置为 350 MB * (核心数) + 450 MB RAM;如果您处理的是阿拉伯语或 CJK 语言 文档,则建议配置为 850 MB * (核心数) + 750 MB RAM。

使用场景

我们先假设您需要处理大量文档。但同时也要考虑您希望获得怎样的结果,并据此选择最适合完成任务的方法。需要考虑的典型场景包括:
  • 转换页数很多的多页文档。这通常意味着处理书籍、长篇报告等。在这种情况下,您可以并行识别文档的各个页面,然后在主进程中执行合成,之后再并行导出。使用引擎池时,您也可以同时处理多个多页文档,但内存消耗可能非常大,甚至导致“内存不足”错误。
  • 转换大量单页文档。这种情况常见于处理发票、合同、信函等。对于这种场景,并行处理最为简单,因为单页文档彼此独立,不会同时占用大量内存。
  • 处理大量图像,并从中搜索所需信息,或以其他方式利用识别结果。您可能不需要将其中大部分转换为可编辑格式,因此合成和导出的速度并不是问题。在这种情况下,可在多个进程中执行的操作是遍历版面块并访问文本块的识别结果。
如果您希望在导出时使用并行处理,请注意,此功能仅支持导出为 PDF (TextOnly 模式除外) 和 PPTX 格式。

建议和限制

  • 对于多页文档的并行处理,我们建议使用 FRDocument。这是最容易实现的多进程处理方式,因为您无需实现任何额外接口。
    打开、预处理、分析和识别会并行执行;文档合成在主进程中按顺序执行,之后导出为 PDF (TextOnly 模式除外) 以及 PPTX 格式会并行执行。
  • 对于处理从某个来源 (如扫描仪) 接收的大量单页文档,我们建议使用 BatchProcessor。
    这种方法的优点是:即使您无法预先知道文档数量,且这些文档可能类型各异、必须在接收后立即处理,也可以使用。缺点是需要更多实现工作:您必须为文件适配器和自定义图像源实现接口。
    所有处理阶段都会并行执行,因为对于单页文档,页面合成和文档合成都会分别对每一页执行。
在使用 Batch Processor 的场景中,不支持并行导出。
要捕获并处理并行处理期间发生的事件,您可以使用 IParallelProcessingCallback 接口。该接口对于处理异常情况非常有用。例如,发生超时错误时,IParallelProcessingCallback 接口会根据用户偏好提供多种解决方案。有关更多信息,请参见 IParallelProcessingCallback::OnWaitIntervalExceeded
页面并行处理期间发生的事件会转换为整个文档的事件。

使用 FRDocument 对象进行处理

要运行的进程数会根据可用的物理或逻辑 CPU 核心数、许可证中可用的空闲 CPU 核心数以及文档页数自动确定。要启用多进程模式,请执行以下操作:
  1. 设置 Engine 对象的 MultiProcessingParams 子对象中 MultiProcessingMode 属性的值。如果此属性设置为 MPM_ParallelMPM_Auto,并且文档页数和可用 CPU 核心数均大于 1,则会使用并行处理。
  2. 使用 RecognitionProcessesCount 属性调整要运行的进程数,并在需要时指定其他属性的值。
配置好多进程设置后,您可以按照处理 FRDocument 的标准流程进行操作。当您调用 FRDocument 对象的以下任一方法时,ABBYY FineReader Engine 会自动启动多个识别进程: 对于文档的每一页,都会创建一个新的处理任务,并将其分配给某个识别进程。当某个识别进程完成该任务后,它会接收下一个处理任务。如此持续,直到所有任务都处理完毕。

使用 Batch Processor 进行处理

初始化 Batch Processor 时,系统会调用并配置异步识别进程。随后,处理器会从自定义图像源中获取图像文件。对于图像文件中的每个页面,都会创建一个新的处理任务,并将该任务分配给某个识别进程。如果某个文件的所有任务都已提交处理,但识别进程尚未全部占满,则会从源的图像队列中取出下一个图像文件并提交处理。该过程会一直持续,直到第一个图像页面被转换并返回给用户。页面会按照从图像源中提取的顺序返回给用户。 要使用 Batch Processor 组织多进程处理,请执行以下操作:
  1. 实现 IImageSourceIFileAdapter 接口,以便访问图像源及其中的文件。
  2. [可选] 实现 IAsyncProcessingCallback 接口来管理处理过程。该接口的方法可用于处理错误和/或取消处理。
  3. [可选] 使用 Engine 对象的 MultiProcessingParams 子对象设置多进程处理。请注意,无需设置 MultiProcessingMode 属性,因为使用 Batch Processor 时默认采用并行处理。如有需要,可使用 RecognitionProcessesCount 属性调整运行的进程数,并设置其他属性的值。
  4. 调用 Engine 对象的 CreateBatchProcessor 方法,以获取 BatchProcessor 对象。
  5. 调用该对象的 Start 方法,以初始化处理器并启动异步识别进程。调用此方法时,你可以指定图像源,传入 IAsyncProcessingCallback 接口引用以及参数对象。
  6. 在循环中调用 GetNextProcessedPage 方法,直到该方法返回 0,这表示源中已没有更多图像,且所有处理后的图像都已返回给用户。
GetNextProcessedPage 方法返回的页面仅在下一次调用该方法之前有效。因此,如果你想保存此页面,你必须在下一次调用 GetNextProcessedPage 方法之前,使用 FRPage 对象的方法保存它,或使用 IFRDocument::AddPage 方法将其添加到现有文档中。
ABBYY FineReader Engine 发行包包含 BatchProcessing 示例,展示了如何使用 Batch Processor。

另请参见

FRDocument BatchProcessor MultiProcessingParams 遍历文档页面