基本上,在 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 /> | 單頁文件 | 單一多頁文件 | 不匯出直接搜尋結果 |
|---|
| 循序處理 | 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 預先定義 profile 的設定。表中的數字表示每分鐘處理的頁數。在「單頁文件」和「單一多頁文件」這兩種情境中,文件會匯出為 PDF 格式。
要執行的處理序數量會根據可用的實體或邏輯 CPU 核心數、授權可用的空閒 CPU 核心數,以及文件中的頁面數自動判定。若要啟用多重處理模式,請執行下列操作:
- 設定 Engine 物件中 MultiProcessingParams 子物件的 MultiProcessingMode 屬性值。若此屬性設為 MPM_Parallel 或 MPM_Auto,且文件頁面數與可用 CPU 核心數皆大於 1,則會使用平行處理。
- 使用 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 格式
系統會為文件中的每個頁面建立新的處理工作,並將該工作交給其中一個識別處理序。當某個識別處理序完成該工作後,就會接手下一個處理工作。此流程會持續進行,直到所有工作都處理完成。
// 建立文件
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 實現多重處理,請執行下列步驟:
- 實作 IImageSource 和 IFileAdapter 介面,以提供對影像來源及其中檔案的存取。
- [選用] 實作 IAsyncProcessingCallback 介面來管理處理流程。此介面的方法可讓您處理錯誤和/或取消處理。
- [選用] 使用 Engine 物件的 MultiProcessingParams 子物件設定多重處理。請注意,無須設定 MultiProcessingMode 屬性,因為使用 Batch Processor 時,預設會啟用平行處理。如有需要,請使用 RecognitionProcessesCount 屬性調整要執行的處理序數量,並設定其他屬性的值。
- 呼叫 Engine 物件的 CreateBatchProcessor 方法,以取得 BatchProcessor 物件。
- 呼叫此物件的 Start 方法,以初始化處理器並啟動非同步識別處理序。您可以在呼叫此方法時指定影像來源,並傳入 IAsyncProcessingCallback 介面參考及參數物件。
- 在迴圈中呼叫 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 物件,請使用 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 主控台中使用,而該主控台可透過下列命令列執行:
- 若要在終端使用者的電腦上安裝應用程式時註冊 FREngine.dll,請使用 regsvr32 公用程式。如果您使用的是 64 位元作業系統,預設會執行 64 位元版的 regsvr32。請使用下列命令列:
regsvr32 /s /n /i:"<path to the Inc folder>" "<path to FREngine.dll>"
ABBYY FineReader Engine 發行套件包含 EnginesPool 範例,該範例展示了使用 Engine 集區時的速度提升,並提供可直接使用的實作,可作為您自行開發應用程式的起點。請參閱此範例的原始程式碼,以了解如何實作自訂影像來源、處理例外狀況,以及控制 CPU 核心的使用方式。
FRDocument
BatchProcessor
MultiProcessingParams
逐頁巡覽文件
載入 Engine Object 的不同方法
在多執行緒伺服器應用程式中使用 ABBYY FineReader Engine