メインコンテンツへスキップ
基本的に、ABBYY FineReader Engineでマルチプロセッシングを使用する方法は3つあります。 1つ目は、Engineオブジェクトを1つ使用し、EngineオブジェクトのMultiProcessingParamsプロパティに適切な値を設定する方法です。MultiProcessingParams ABBYY FineReader Engineは、単一のEngineインスタンスからマルチプロセッシングを提供する2種類のオブジェクトをサポートしています。FRDocumentオブジェクト (FRDocumentオブジェクトを使用した処理を参照) とBatchProcessorオブジェクト (Batch Processorを使用した処理を参照) です。 2つ目は、COM経由でアウトプロセスサーバーとして複数のEngineインスタンスをロードし (OutprocLoaderオブジェクトを使用) 、各インスタンスをそれぞれのプロセスで使用する方法です。詳細はEngineプールを使用した処理を参照してください。
並列処理は逐次処理よりも多くのRAMを必要とする点にご注意ください。ワークステーションの一般的な推奨値は350 MB * (コア数) + 450 MB RAMです。アラビア語またはCJK言語のドキュメントを処理する場合は、850 MB * (コア数) + 750 MB RAMが推奨されます。

使用シナリオ

ここでは、多数の文書を処理することを前提とします。ただし、必要な結果も考慮したうえで、タスクの実装に最適な方法を選ぶ必要があります。検討すべき主なシナリオは次のとおりです。
  • ページ数の多い複数ページ文書を変換する場合。一般的には、書籍や長いレポートなどを処理するケースです。この場合、文書のページを並列に認識し、その後メインプロセスで合成を実行して、さらに並列でエクスポートできます。また、Engine のプールを使用している場合は、複数の複数ページ文書を同時に処理することもできますが、メモリ消費量が非常に大きくなり、“out of memory” エラーが発生することもあります。
  • 1ページ文書を大量に変換する場合。請求書、契約書、レターなどを処理するケースです。このような状況では、並列処理が最も容易です。1ページ文書は相互に依存せず、一度に大量のメモリを必要としないためです。
  • 大量の画像を処理し、必要な情報を検索したり、認識結果を別の方法で利用したりする場合。これらの大半は編集可能な形式に変換する必要がない可能性があるため、合成やエクスポートの速度は問題になりません。複数のプロセスで実行される操作は、レイアウトブロックを順に処理し、テキストブロックの認識結果にアクセスすることです。
エクスポートで並列処理を使用する場合は、この機能がサポートされているのは PDF へのエクスポート (TextOnly モードを除く) と PPTX 形式のみであることに注意してください。

推奨事項と制限事項

  • 多ページ文書の並列処理を行う場合、FRDocument の使用をおすすめします。追加のインターフェイスを実装する必要がないため、コーディングが最も簡単なマルチプロセッシング手法です。
    開く、前処理、分析、認識は並列で実行されます。文書合成はメイン プロセスで順次実行され、その後、PDF および PPTX 形式へのエクスポート (TextOnly モードを除く) が並列で実行されます。
  • スキャナーなどのソースから受信される多数の 1 ページ文書を処理する場合、BatchProcessor の使用をおすすめします。
    この手法の利点は、文書の数を事前に知らない場合、文書が異なる種類の場合、または到着次第すぐに処理する必要がある場合に使用できる点です。欠点は、実装に追加の労力が必要な点で、ファイル アダプターとカスタム画像ソース用のインターフェイスを実装しなければなりません。
    すべての処理ステージは並列で実行されます。1 ページ文書の場合、ページごとおよび文書合成が個別に実行されるためです。
Batch Processor を使用したシナリオでは、並列エクスポートはサポートされていません。
  • 多数の 1 ページ文書を並列でフル処理するには、COM を使用してアウトプロセスで読み込まれた Engine のプールを使用できます。この手法は速度面で最も効率的であり、マルチスレッド関連のすべての問題を自動的に解消します。ABBYY FineReader Engine オブジェクトのすべての操作が COM を介して直列化されるためです。ただし、いくつかの制限があります:
  • COM の使用により、FREngine.dll を登録する必要があります。
  • コードが C++ で記述されている場合、COM との操作は、たとえば C# に比べてより多くの煩雑なコーディングを必要とします。
  • この場合、処理は別のプロセスで実行されるため、メモリから画像を開くことができず、認識結果のイテレーションに時間がかかります。各リクエストが別のプロセスに渡され、戻されるためです。
  • 最後に、いくつかの Engine インスタンスを読み込むことは、より多くのメモリ消費を意味します。特に、この場合すべての処理ステージが並列で実行され、いくつかの同時合成操作が同時に進行し、さらにメモリを使用するためです。
  • 並列処理中に発生したイベントをキャッチして処理するには、IParallelProcessingCallback インターフェイスを使用できます。このインターフェイスは、問題が発生した状況を管理するのに非常に役立ちます。たとえば、タイムアウト エラーが発生した場合、IParallelProcessingCallback インターフェイスは、ユーザー設定に応じて問題に対するいくつかの解決策を提供します。詳細については、IParallelProcessingCallback::OnWaitIntervalExceeded を参照してください。
ページの並列処理中に発生したイベントは、全体の文書のイベントに変換されます。

速度テストの結果

以下の表にパフォーマンステストの結果を示します。
<br />1ページ文書1つの複数ページ文書エクスポートなしでの結果検索
逐次処理605187
FRDocument を使用した処理4111757
FRDocument を使用した処理 (with PageFlushingPolicy = PFP_KeepInMemory)5514182
Batch Processor を使用した処理99115294
Engines のプールを使用した処理16510102
テストマシンのプロセッサは Intel® Core™ i5-4440 (3.10 GHz、4 物理コア)、RAM は 8 GB で、同時に実行されるプロセスの数は 4 です。パフォーマンスは、DocumentArchiving_Speed プリ定義プロファイルの設定を使用して、300 枚の英語画像でテストされました。表の数値は 1 分間に処理されたページ数です。「1 ページ文書」および「1 つの複数ページ文書」のシナリオでは、文書を PDF 形式にエクスポートします。

FRDocument オブジェクトを使用した処理

実行するプロセス数は、使用可能な物理または論理 CPU コア数、ライセンスで利用可能な空き CPU コア数、およびドキュメントのページ数に基づいて自動的に決定されます。マルチプロセッシングモードを有効にするには、次の手順を実行します。
  1. Engine オブジェクトの MultiProcessingParams サブオブジェクトの MultiProcessingMode プロパティの値を設定します。このプロパティが MPM_Parallel または MPM_Auto に設定されており、ドキュメントのページ数と使用可能な CPU コア数がいずれも 1 より大きい場合、並列処理が使用されます。
  2. RecognitionProcessesCount プロパティを使用して実行するプロセス数を調整し、必要に応じてその他のプロパティの値を指定します。
マルチプロセッシングの設定が完了したら、FRDocument を使用した標準的な作業手順を利用できます。ABBYY FineReader Engine は、FRDocument オブジェクトの以下のメソッドのいずれかを呼び出すと、複数の認識プロセスを自動的に開始します。 ドキュメントの各ページに対して新しい処理タスクが作成され、そのタスクはいずれかの認識プロセスに渡されます。認識プロセスがタスクを完了すると、次の処理タスクを受け取ります。これはすべてのタスクが処理されるまで繰り返されます。
// ドキュメントを作成する
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が初期化されると、非同期認識プロセスが起動・設定されます。その後、プロセッサはカスタム画像ソースから画像ファイルを取得します。画像ファイルの各ページに対して新しい処理タスクが作成され、そのタスクはいずれかの認識プロセスに渡されます。1つのファイルのすべてのタスクが処理のために渡されたにもかかわらず、すべての認識プロセスが使用中でない場合、ソースの画像キューから次の画像ファイルが取得され、処理に渡されます。この処理は、最初の画像ページが変換されてユーザーに渡されるまで繰り返されます。ページは画像ソースから取得された順序でユーザーに返されます。 Batch Processorを使用してマルチプロセッシングを構成するには、以下の手順に従います。
  1. 画像ソースおよびその中のファイルへのアクセスを提供する IImageSource インターフェイスと IFileAdapter インターフェイスを実装します。
  2. [省略可能] 処理を管理するために IAsyncProcessingCallback インターフェイスを実装します。このインターフェイスのメソッドを使用すると、エラーの処理や処理のキャンセルが可能です。
  3. [省略可能] Engine オブジェクトの MultiProcessingParams サブオブジェクトを使用してマルチプロセッシングを設定します。Batch Processorを使用する場合はデフォルトで並列処理が使用されるため、MultiProcessingModeプロパティを設定する必要はありません。RecognitionProcessesCountプロパティで実行するプロセス数を調整し、必要に応じてその他のプロパティの値を指定します。
  4. Engine オブジェクトの CreateBatchProcessor メソッドを呼び出して、BatchProcessorオブジェクトを取得します。
  5. このオブジェクトの Start メソッドを呼び出して、プロセッサを初期化し、非同期認識プロセスを起動します。このメソッドの呼び出し時に、画像のソースを指定し、IAsyncProcessingCallbackインターフェイスおよびParameterオブジェクトへの参照を渡すことができます。
  6. GetNextProcessedPageメソッドをループ内で呼び出し続け、メソッドが0を返した時点で終了します。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 の配布パッケージには、Batch Processorの使用方法を示す BatchProcessing サンプルと、Batch Processorを使用したマルチプロセッシング認識による速度向上を示す BatchProcessingRecognition デモツールが含まれています。

Engineのプールを使用した処理

このマルチプロセッシングシナリオでは、アウトプロセスで読み込まれた複数のEngineインスタンスを使用します。各ワーカースレッド内の手順は、単一スレッドの処理とほぼ同じです。ただし、各画像が必ず一度だけ処理されるよう、何らかの同期オブジェクトを使用してスレッド間で画像を分配するカスタム画像ソースを実装することを推奨します。 Engineオブジェクトをアウトプロセスで読み込むには、IEngineLoaderインターフェイスを実装するOutprocLoaderオブジェクトを使用します。特別なアカウントで使用する場合、そのアカウントで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」と入力するか、コントロールパネル > 管理ツール > コンポーネントサービスを選択します) 。コンソールツリーで、コンポーネントサービス > コンピューター > マイコンピューター > DCOM Config フォルダーを開き、ABBYY FineReader Engine 12.5 Loader (ローカルサーバー) を右クリックして「プロパティ」をクリックします。ダイアログが開きます。「セキュリティ」タブをクリックし、「起動とアクティブ化のアクセス許可」の「カスタマイズ」をクリックしてから「編集」をクリックして、アプリケーションを起動できるアカウントを指定します。
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 オブジェクトのさまざまな読み込み方法 マルチスレッドサーバーアプリケーションでの ABBYY FineReader Engine の使用