跳轉到主要內容
基本上,在 ABBYY FineReader Engine 中使用多重處理主要有三種方式: 一種方式是使用單一 Engine 物件,並將 Engine 物件的 MultiProcessingParams 屬性設為適當的值。 ABBYY FineReader Engine 支援兩種不同的物件,可由單一 Engine 實例提供多重處理功能。它們分別是 FRDocument 物件 (請參閱 使用 FRDocument 物件進行處理) 以及 BatchProcessor 物件 (請參閱 使用 Batch Processor 進行處理) 。 另一種方式是透過 COM 載入多個 Engine 實例,將其作為處理序外伺服器 (使用 OutprocLoader 物件) ,並在各自的處理序中使用每個實例。請參閱 使用 Engine 集區進行處理
請注意,平行處理比循序處理需要更多 RAM。對工作站的一般建議為 350 MB * (核心數) + 450 MB RAM;如果您處理的是阿拉伯文或 CJK 語言 文件,則建議為 850 MB * (核心數) + 750 MB RAM。

使用情境

我們先假設您需要處理大量文件。但同時也必須考量您希望取得的結果,並選擇最適合完成任務的方法。需要考慮的幾種情境如下:
  • 轉換頁數很多的多頁文件。這通常是指處理書籍、長篇報告等。在這種情況下,您可以並行識別文件頁面,接著在主處理序中執行合成,然後再次並行匯出。使用 Engine 集區 時,您也可以同時處理多份多頁文件,但記憶體用量可能非常龐大,甚至導致「out of memory」錯誤。
  • 轉換大量單頁文件。這是處理發票、合約、信件等時的典型情況。對於這種情況,平行處理最容易實作,因為單頁文件彼此之間沒有相依性,也不需要一次占用大量記憶體。
  • 處理大量影像,並在其中搜尋所需資訊,或以其他方式利用識別結果。您可能不需要將其中大多數轉換為可編輯格式,因此合成和匯出的速度不是問題。在多個處理序中執行的作業,將是逐一走訪版面配置區塊,並存取文字區塊的識別結果。
如果您想在匯出時使用平行處理,請注意,此功能僅支援匯出為 PDF (TextOnly 模式除外) 和 PPTX 格式。

建議與限制

  • 對於多頁文件的平行處理,我們建議使用 FRDocument。這是最容易實作的多重處理方式,因為您不需要實作任何額外介面。
    開啟、預處理、分析和識別會平行執行;文件合成會在主處理序中依序執行,之後匯出為 PDF (TextOnly 模式除外) ;而匯出為 PPTX 格式則會平行執行。
  • 若要處理許多從某個來源 (例如掃描器) 接收的一頁式文件,我們建議使用 BatchProcessor。
    這種方法的優點是,即使您無法預先得知文件數量、文件類型可能各不相同,且必須在文件一到達時立即處理,也能使用。缺點是需要投入較多實作工作:您必須為檔案配接器和自訂影像來源實作介面。
    所有處理階段都會平行執行,因為在一頁式文件的情況下,頁面合成和文件合成都會針對每個頁面分別進行。
在使用 Batch Processor 的情境中,不支援平行匯出。
  • 若要對大量一頁式文件執行完整的平行處理,您可以使用透過 COM 在處理序外載入的 Engine 集區。這種方法在速度上最有效率,並且會自動排除所有與多執行緒相關的困難:所有對 ABBYY FineReader Engine 物件的操作都會透過 COM 序列化。不過,它也有一些限制:
  • 由於使用 COM,您需要註冊 FREngine.dll;
  • 如果您的程式碼是以 C++ 撰寫,使用 COM 會比使用例如 C# 需要更多例行程式碼;
  • 在此情況下,處理會在另一個處理序中進行,因此您無法從記憶體開啟影像,而且逐一查看識別結果會花費更多時間,因為每個請求都必須傳送到另一個處理序再傳回;
  • 最後,載入多個 Engine 實例意味著會消耗更多記憶體;尤其在此情況下,所有處理階段都會平行執行,而且多個合成作業可能同時進行,進一步耗用更多記憶體。
  • 若要擷取並處理平行處理期間發生的事件,您可以使用 IParallelProcessingCallback 介面。此介面在處理異常情況時非常實用。例如,發生逾時錯誤時,IParallelProcessingCallback 介面會根據使用者偏好提供多種解決方案。如需詳細資訊,請參閱 IParallelProcessingCallback::OnWaitIntervalExceeded
頁面在平行處理期間發生的事件會轉換為整份文件的事件。

速度測試結果

下表顯示效能測試結果。
<br />單頁文件單一多頁文件不匯出直接搜尋結果
循序處理605187
使用 FRDocument 處理4111757
使用 FRDocument 處理 (PageFlushingPolicy = PFP_KeepInMemory)5514182
使用 Batch Processor 處理99115294
使用 Engine 集區處理16510102
測試機器採用 Intel® Core™ i5-4440 處理器 (3.10 GHz,4 個實體核心) ,配備 8 GB RAM,同時執行的處理序數量為 4。效能測試在 300 張英文影像上進行,並使用 DocumentArchiving_Speed 預先定義 profile 的設定。表中的數字表示每分鐘處理的頁數。在「單頁文件」和「單一多頁文件」這兩種情境中,文件會匯出為 PDF 格式。

使用 FRDocument 物件處理

要執行的處理序數量會根據可用的實體或邏輯 CPU 核心數、授權可用的空閒 CPU 核心數,以及文件中的頁面數自動判定。若要啟用多重處理模式,請執行下列操作:
  1. 設定 Engine 物件中 MultiProcessingParams 子物件的 MultiProcessingMode 屬性值。若此屬性設為 MPM_Parallel 或 MPM_Auto,且文件頁面數與可用 CPU 核心數皆大於 1,則會使用平行處理。
  2. 使用 RecognitionProcessesCount 屬性調整要執行的處理序數量,並視需要指定其他屬性的值。
設定好多重處理參數後,您即可依照標準程序使用 FRDocument。當您呼叫 FRDocument 物件的下列任一方法時,ABBYY FineReader Engine 會自動啟動多個識別處理序: 系統會為文件中的每個頁面建立新的處理工作,並將該工作交給其中一個識別處理序。當某個識別處理序完成該工作後,就會接手下一個處理工作。此流程會持續進行,直到所有工作都處理完成。
// 建立文件
FREngine.IFRDocument document = engine.CreateFRDocument();
// 將頁面新增至文件
for( int index = 0; index < filesNumber; index++ ) {
    string imagePath = filePaths[index];
    document.AddImageFile( imagePath, null, null );
}
// 設定多重處理參數
engine.MultiProcessingParams.MultiProcessingMode = FREngine.MultiProcessingModeEnum.MPM_Parallel;
engine.MultiProcessingParams.RecognitionProcessesCount = coresNumber;
// 建立並設定文件處理參數
FREngine.IDocumentProcessingParams documentProcessingParams = engine.CreateDocumentProcessingParams();
...
// 處理文件
document.Process( documentProcessingParams );
// 照常合成並匯出文件、處理結果等
...
ABBYY FineReader Engine 發行套件包含 MultiProcessingRecognition 示範工具,可展示使用 FRDocument 物件進行多重處理識別時的速度提升,並提供可作為開發自有應用程式起點的實作範例。

使用 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 方法將其加入現有文件。
// 建立 Batch Processor
FREngine.IBatchProcessor batchProcessor = engine.CreateBatchProcessor();
// 設定多重處理參數
engine.MultiProcessingParams.RecognitionProcessesCount = coresNumber;
// 初始化處理器
FREngine.IImageSource imageSource = new CImageSource; // 此類別由使用者實作
batchProcessor.Start( imageSource, null, null, null );
// 開始處理
while( true ) {
 FREngine.IFRPage page = batchProcessor.GetNextProcessedPage();
 if( page == null ) {
  break; // 已無更多頁面,工作結束
 }
 // 對頁面執行某些操作
 page.Synthesize( null );
 page.Export("D:\\sample.pdf", FREngine.FileExportFormatEnum.FEF_PDF, null);
}
ABBYY FineReader Engine 發行套件包含 BatchProcessing 範例,示範如何使用 Batch Processor,以及 BatchProcessingRecognition 示範工具,展示在 Batch Processor 中使用多重處理識別時可獲得的速度提升。

使用 Engine 集區進行處理

在這個多重處理情境中,您會使用數個以處理序外方式載入的 Engine 實例。在每個工作執行緒中,處理程序幾乎可與單一執行緒處理時相同。不過,建議您實作自訂影像來源,並使用某種同步物件在各執行緒間分配影像,以確保每張影像都只會被處理一次。 若要以處理序外方式載入 Engine 物件,請使用 OutprocLoader 物件;此物件會實作 IEngineLoader 介面。若搭配特殊帳戶使用,可能需要相關權限才能讓這類帳戶執行 OutprocLoader。
// 為每個執行緒建立個別的 OutprocLoader 物件,並載入一個 Engine 實例
IEngineLoader engineLoader = new FREngine.OutprocLoader();
IEngine engine = engineLoader.InitializeEngine( customerProjectId, LicensePath, LicensePassword, "", "", false );
// 我們已在個別的處理序中取得 Engine
try {
 ...
} finally {
 engineLoader.ExplicitlyUnload(); // 不再需要時即可將其卸載
 engineLoader = null;
 GC.Collect();
 GC.WaitForPendingFinalizers();
}
此外,您也可以使用 IHostProcessControl 介面來管理主機處理序的優先順序,並控制其是否仍在執行。
  • 可使用 DCOM Config 公用程式設定帳戶權限 (可在命令列輸入 DCOMCNFG,或依序選取 Control Panel > Administrative Tools > Component Services) 。在主控台樹狀目錄中,找到 Component Services > Computers > My Computer > DCOM Config 資料夾,然後以滑鼠右鍵按一下 ABBYY FineReader Engine 12.5 Loader (Local Server),再按一下 Properties。隨即會開啟一個對話方塊。按一下 Security 索引標籤。在 Launch Permissions 下,按一下 Customize,然後按一下 Edit,以指定哪些帳戶可以啟動此應用程式。
請注意,在 64 位元作業系統上,已註冊的 DCOM 應用程式可在 32 位元 MMC 主控台中使用,而該主控台可透過下列命令列執行:
"mmc comexp.msc /32"
  • 若要在終端使用者的電腦上安裝應用程式時註冊 FREngine.dll,請使用 regsvr32 公用程式。如果您使用的是 64 位元作業系統,預設會執行 64 位元版的 regsvr32。請使用下列命令列:
regsvr32 /s /n /i:"<path to the Inc folder>" "<path to FREngine.dll>"
  • 將 Engine 實作成處理序外伺服器時,請將 MultiProcessingParams 物件的 MultiProcessingMode 屬性設為 MPM_Sequential,以將文件處理指定為循序模式。
ABBYY FineReader Engine 發行套件包含 EnginesPool 範例,該範例展示了使用 Engine 集區時的速度提升,並提供可直接使用的實作,可作為您自行開發應用程式的起點。請參閱此範例的原始程式碼,以了解如何實作自訂影像來源、處理例外狀況,以及控制 CPU 核心的使用方式。

另請參閱

FRDocument BatchProcessor MultiProcessingParams 逐頁巡覽文件 載入 Engine Object 的不同方法 在多執行緒伺服器應用程式中使用 ABBYY FineReader Engine