メインコンテンツへスキップ
大量のドキュメントを処理する場合、Optical Character Recognition (OCR) は非常に多くの処理能力を必要とすることがあります。処理速度を向上させるにはマルチ CPU システムの利用が効果的なことが多く、ABBYY FineReader Engine には、ハードウェア構成のマルチプロセッシング機能を活用するための方法がいくつか用意されています。 このセクションでは、想定される利用シナリオを概説し、テスト結果とあわせて、タスクに適したマルチプロセッシング モードを選択するための推奨事項を示します。また、マルチプロセッシングの実装例を示したコード サンプルへのリンクも掲載しています。 マルチプロセッシングを使用するには、Engine オブジェクトの MultiProcessingParams プロパティを適切な値に設定する必要があります。 ABBYY FineReader Engine では、1 つの Engine インスタンスでマルチプロセッシングを実現する 2 種類のオブジェクトをサポートしています。具体的には、FRDocument オブジェクト (FRDocument オブジェクトを使用した処理を参照) と、BatchProcessor オブジェクト (Batch Processor を使用した処理を参照) です。
並列処理では、逐次処理よりも多くの RAM が必要になる点に注意してください。ワークステーションの一般的な推奨値は 350 MB * (コア数) + 450MB RAM で、アラビア語または CJK 言語 のドキュメントを処理する場合は 850 MB * (コア数) + 750MB RAM です。

使用シナリオ

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

推奨事項と制限事項

  • 複数ページの文書を並列処理するには、FRDocument の使用をお勧めします。追加のインターフェイスを実装する必要がないため、マルチプロセッシング向けの実装が最も容易な方法です。
    オープン、前処理、解析、認識は並列で実行されます。文書合成はメインプロセスで順次実行され、その後、PDF へのエクスポート (TextOnly モードを除く) と PPTX 形式へのエクスポートは並列で実行されます。
  • 何らかのソース (スキャナーなど) から受け取る多数の 1 ページ文書を処理するには、BatchProcessor をお勧めします。
    この方法の利点は、文書数が事前にわからない場合でも使用でき、さらに文書の種類が異なっていても、到着したものから直接処理しなければならない場合に対応できることです。欠点は、実装の手間がよりかかることです。ファイルアダプター用のインターフェイスと、カスタム画像ソース用のインターフェイスを実装する必要があります。
    1 ページ文書の場合は、ページ合成と文書合成がページごとに個別に実行されるため、すべての処理段階が並列で実行されます。
Batch Processor を使用するシナリオでは、並列エクスポートはサポートされていません。
並列処理中に発生したイベントを捕捉して処理するには、IParallelProcessingCallback インターフェイスを使用できます。このインターフェイスは、問題が発生した状況を管理するうえで非常に役立ちます。たとえば、タイムアウトエラーが発生した場合、IParallelProcessingCallback インターフェイスは、ユーザー設定に応じてこの問題に対する複数の解決策を提供します。詳細については、IParallelProcessingCallback::OnWaitIntervalExceeded を参照してください。
ページの並列処理中に発生したイベントは、文書全体のイベントに変換されます。

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

実行するプロセス数は、使用可能な物理または論理 CPU コア数、ライセンスで使用可能な空き CPU コア数、および文書のページ数に応じて自動的に決定されます。マルチプロセッシングモードを有効にするには、次の操作を行います。
  1. Engine オブジェクトの MultiProcessingParams サブオブジェクトで、MultiProcessingMode プロパティの値を設定します。このプロパティが MPM_Parallel または MPM_Auto に設定されており、かつ文書のページ数と使用可能な CPU コア数の両方が 1 より大きい場合、並列処理が使用されます。
  2. RecognitionProcessesCount プロパティを使用して実行するプロセス数を調整し、必要に応じて他のプロパティの値も指定します。
マルチプロセッシングの設定を行った後は、FRDocument を使用する標準的な手順に従うことができます。ABBYY FineReader Engine は、FRDocument オブジェクトの次のいずれかのメソッドを呼び出すと、自動的に複数の認識プロセスを開始します。 文書の各ページごとに新しい処理タスクが作成され、そのタスクは認識プロセスのいずれか 1 つに渡されます。認識プロセスはタスクを完了すると、次の処理タスクを受け取ります。これが、すべてのタスクが処理されるまで繰り返されます。

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 インターフェイスおよび parameters オブジェクトへの参照を渡すことができます。
  6. メソッドが 0 を返すまで、ループ内で GetNextProcessedPage メソッドを呼び出します。これは、ソース内にこれ以上画像がなく、処理済みのすべての画像がユーザーに返されたことを意味します。
GetNextProcessedPage メソッドによって返されるページは、このメソッドの次回の呼び出しまで有効です。したがって、このページを保存する場合は、GetNextProcessedPage メソッドの次回の呼び出し前に、FRPage オブジェクトのメソッドを使用して保存するか、IFRDocument::AddPage メソッドを使用して既存の document に追加する必要があります。
ABBYY FineReader Engine の distribution pack には、Batch Processor の使用方法を示す BatchProcessing サンプルが含まれています。

関連項目

FRDocument BatchProcessor MultiProcessingParams 文書ページを順に処理する