使用 ABBYY FineReader Engine 进行平行处理
如需处理大量文档,那么就处理能力而言 OCR 会要求很高。这就需要使用多 CPU 系统来提高处理速度。ABBYY FineReader Engine 可提供多种方式方便您使用硬件配置的多重处理功能。
本节概述了可能的使用场景,就如何为任务选择特定的多重处理模式给出了建议以及测试统计数据。本节中也提供了代码示例链接,内含多重处理实例。
基本上来说,ABBYY FineReader Engine有三种方式来进行多重处理:
一方面,您可以使用 Engine 对象,将 Engine 对象的 MultiProcessingParams 属性设置为合适的值。
ABBYY FineReader Engine 支持两种不同对象,均可对单个Engine 实例进行多重处理。它们是 FRDocument 对象(请参见使用 FRDocument 对象进行处理)和 BatchProcessor 对象(请参见使用 Batch Processor 进行处理)。
另一方面,您可以通过 COM 将 Engine 的多个实例加载为进程外服务器(使用 OutprocLoader 对象)并在进程中使用每个实例。请参见 使用 Engine 池进行处理。
重要事项!请注意,平行处理比依序处理需要更多 RAM 内存。对于一台工作站而言,一般是 350 MB *(内核数量)+ 450MB RAM,如果处理的文档为阿拉伯语或者 CJK 语言 则为850 MB * (内核数量)+ 750MB RAM。
使用场景
我们默认您正在处理大量文档。但我们也必须考虑到您所需要的结果,并为此选择实现任务的最佳方案。要考虑的不同场景如下:
- 转换多个含有大量页面的文档。这通常指处理书籍、长篇报告等等。在此情况下,您可以对文档页面进行平行识别,然后在主进程中将其合成,再平行导出。使用 Engine 池时,可以同时处理多个多页文档,但会消耗很大内存,甚至导致“内存不足”。
- 转换大量单页文档。即处理发票、合同、信件等。对此,平行处理最方便,因为单页文档彼此无关,不需要同时占用大量内存。
- 处理大量图像以及搜索它们的必要信息,或者用其它方式处理识别结果。无需将其中大部分都转换成可编辑格式,所以合成和导出速度不是问题。循环访问布局块以及访问文本块的识别结果将在多进程中执行。
注: 如果您想使用平行处理导出,请注意该功能仅支持导出到 PDF(TextOnly 模式除外)和PPTX 格式。
建议和限制
- 如需平行处理 多页文档 我们建议使用 FRDocument。这种多重处理方式的编码最容易,不需要任何附加接口。
平行执行打开、预处理、分析和识别;文档合成在主进程中依序执行,然后平行执行导出到 PDF(TextOnly 模式除外)和 PPTX 格式。
- 若要处理从一些来源(例如扫描仪)收到的多个 单页文档,我们建议使用 BatchProcessor。该方法的优势是可以在清楚文档数量的情况下使用,可以是不同类型的文档并且要在接收后即时处理。缺点是需要更多的实现工作,必须为执行文件适配器和自定义图像源实现接口。
要对所有的处理阶段进行平行执行,因为在处理单页文档时,对于每个页面都要单独执行页面和文档合成。
注:Batch Processor方案不支持平行导出。
- 若要平行处理多个 单页文档 ,您可以使用通过 COM 进程外加载的 Engines 池。此方法速度最快,可以自动规避与多线程相关的所有问题:通过 COM 对ABBYY FineReader Engine 对象的所有操作都进行了序列化。但它也有一些限制:
- 由于使用 COM,您需要注册 FREngine.dll;
- 如果代码是用 C++ 编写的,那么使用 COM 会比C#等语言需要更多例行编码;
- 在此情况下,其处理会在另一个进程中进行,所以内存中的图像不可以打开,并且由于每个请求都需往返传递到另一进程,循环访问识别结果会花费更多的时间;
- 最后,加载多个 Engine 实例就会消耗更多内存,特别是在平行执行所有处理阶段且多个同步合成操作同时进行的情况下,这会占据更多内存。
- 若要捕捉和处理平行处理中发生的事件,您可以使用 IParallelProcessingCallback 接口。该接口十分适用于棘手情形的管理。例如,当发生超时错误时,IParallelProcessingCallback 接口可根据用户偏好提供多种问题解决方案。如需了解更多信息,请参见 IParallelProcessingCallback::OnWaitIntervalExceeded。
注: 平行理页面期间发生的事件将被转换为整个文档的事件。
速度测试结果
下表中呈现了性能测试结果。
单页文档 | 一个多页文档 | 搜索结果而不导出 | |
---|---|---|---|
依序处理 | 60 | 51 | 87 |
用 FRDocument 进行处理 | 41 | 117 | 57 |
用 FRDocument 进行处理 (PageFlushingPolicy= PFP_KeepInMemory) | 55 | 141 | 82 |
使用 Batch Processor 进行处理 | 99 | 115 | 294 |
使用 Engine 池进行处理 | 165 | 10 | 102 |
测试机器的处理器是 Intel® Core™ i5-4440 (3.10 GHz,4个物理内核),8 GB RAM,可同时运行的进程数量为4个。对300个英文图像进行了性能测试,设置为 DocumentArchiving_Speed 预定义配置文件。表格中的数字是每分钟处理的页面。在"单页文档"和"单个多页文档"场景中,文档被导出为 PDF 格式。
使用 FRDocument 对象进行处理
将根据可用的物理或逻辑 CPU 内核数量、许可证中可用的免费 CPU 内核数量以及文档页数,自动检测要运行的进程数量。如要开启多重处理模式,请执行以下操作:
- 设置 Engine 对象的 MultiProcessingParams 子对象的 MultiProcessingMode 属性的值。如果该属性被设为 MPM_Parallel 或 MPM_Auto,且文档页数和可用 CPU 内核数量都大于一,则使用平行处理。
- 使用 RecognitionProcessesCount 属性调整要运行的进程数量,并在必要时指定其它属性的值。
完成多重处理设置后,您可以启动处理 FRDocument 的标准程序。当您调用 FRDocument 对象的任一以下方法都会使ABBYY FineReader Engine 自动启动多个识别进程:
- AddImageFile, AddImageFileFromMemory, AddImageFileFromStream, AddImageFileWithPassword, AddImageFileWithPasswordCallback
- Preprocess, PreprocessPages
- Analyze, AnalyzePages
- Recognize, RecognizePages
- Process, ProcessPages
- Export, ExportPages, ExportToMemory — 仅可导出为 PDF (TextOnly 模式除外)和 PPTX 格式
对于文档的每一页,都会创建一个新的处理任务,并将此任务传递给其中一个识别进程。识别进程完成任务后会接收下一个处理任务。直到所有任务处理完后才结束。
C# 代码
ABBYY FineReader Engine 分发包包括 MultiProcessingRecognition 演示工具,此工具可显示用 FRDocument 对象进行多重处理识别的速度提升,并且含有一个可用来开发应用程序的工具。
使用 Batch Processor 进行处理
Batch Processor 初始化时将调用和配置异步识别进程。然后处理器会从自定义图像源调取图像文件。对于图像文件的每一页,都会创建一个新的处理任务,并将此任务传递给其中一个识别进程。如果一个文件的所有任务都已通过处理,但并非所有识别过程都已被占用,则从源的图像队列中获取下一个图像文件并通过处理。直到图像第一页完成转换并传送至用户方为止。页面将按照从图像源获取的顺序返回给用户。
若要用 Batch Processor 进行多重处理,请参照以下操作:
- 实现 IImageSource 和 IFileAdapter 接口,以提供对图像源和其中文件的访问。
- [optional] 实现 IAsyncProcessingCallback 接口来管理处理。该接口的方法可让您实现错误处理和/或取消处理。
- [optional] 使用 Engine 对象的 MultiProcessingParams 子对象设置多重处理。请注意不需要设置 MultiProcessingMode 属性,因为如使用 Batch Processor 则默认使用平行处理。使用 RecognitionProcessesCount 属性调整要运行的进程数量,并在必要时指定其它属性的值。
- 调用Engine 对象的 CreateBatchProcessor 方法来接收 BatchProcessor对象。
- 调用该对象的 Start 方法来初始化处理器和调用异步识别进程。您可以指定图像来源,将引用传递到 IAsyncProcessingCallback 接口和该方法调用中的参数对象。
- 调用循环中的 GetNextProcessedPage 方法直到该方法返回 0,这意味着源中不再有图像,且所有已处理图像均已返回到用户方。
重要事项!GetNextProcessedPage 方法返回的页面将一直保存到该方法的下次调用。因此,如果想要保存该页面,您必须使用 FRPage 对象的方法保存它,或者在下次调用 GetNextProcessedPage 方法前使用 IFRDocument::AddPage 方法将其添加到现有文档。
C# 代码
ABBYY FineReader Engine 分发包包括 BatchProcessing 示例,可显示如何使用 Batch Processor,而且BatchProcessingRecognition 演示工具,可显示用 Batch Processor 进行多重处理识别时的速度提升。
使用 Engine 池进行处理
在此多重处理场景中,您可使用多个进程外加载的 Engine 的多个实例。在每个工作线程内,其处理过程与仅处理单个工作线的处理过程几乎一致。但建议您实现一个自定义图像源,该源将在线程之间分发图像,并使用某种同步对象来确保每个图像只处理一次。
若要进程外加载 Engine 对象,使用 OutprocLoader 对象,它将实现 IEngineLoader 接口。当用特殊账户使用时,可能需要权限来为此类账户运行 OutprocLoader。
C# 代码
此外,您可以使用 IHostProcessControl 接口来管理主机进程的优先级,并控制其是否处于运作状态。
注:
-
账户权限可以通过 DCOM Config 实用工具进行设置(在命令行中键入DCOMCNFG,或者选择 控制面板 > 管理工具 > 组件服务)。在控制台树中,找到 组件服务 > 计算机 > 我的计算机 > DCOM Config文件夹,右键单击 ABBYY FineReader Engine 12.2 Loader (Local Server),然后单击 属性。屏幕上将打开一个对话框。单击 安全 选项。在 启动权限 下,单击 自定义,然后单击 编辑,指定可以启动应用程序的账户。
注意,在 64 位操作系统上,注册的 DCOM 应用程序可在32位 MMC 控制台中使用,该控制台可使用以下命令行运行:
"mmc comexp.msc /32"
-
要在终端用户计算机上安装应用程序时注册 FREngine.dll,请使用以下命令行:
regsvr32 /s /n /i:"<Inc 文件夹路径 >" "<FREngine.dll 的路径>"
- 实施 Engine 为进程外服务器时,通过将 MultiProcessingParams 对象的 MultiProcessingMode 属性设为 MPM_Sequential 来指定文档处理的依序模式。
ABBYY FineReader Engine 分发包包括 EnginesPool 示例,示例可显示使用 Engine 时的速度提升,并提供一个即时可用的实现工具(此工具可用于应用程序开发)。有关实现自定义映像源、处理异常和控制CPU内核使用的详细信息,请参阅本示例的源代码。
另请参阅
17.09.2024 15:14:41