병렬 처리는 순차 처리보다 더 많은 RAM이 필요하다는 점에 유의하세요. 워크스테이션의 일반적인 권장 사양은 350 MB * (코어 수) + 450MB RAM이며, 문서를 아랍어 또는 CJK 언어로 처리하는 경우에는 850 MB * (코어 수) + 750MB RAM입니다.
여기서는 많은 문서를 처리하는 상황을 가정합니다. 다만, 어떤 결과를 얻어야 하는지도 함께 고려해 작업에 가장 적합한 구현 방식을 선택해야 합니다. 고려할 만한 대표적인 시나리오는 다음과 같습니다.
페이지 수가 많은 다중 페이지 문서를 변환하는 경우입니다. 일반적으로 책, 긴 보고서 등을 처리하는 상황에 해당합니다. 이 경우 문서의 페이지를 병렬로 인식한 다음, 주 프로세스에서 합성을 수행하고 다시 병렬로 내보낼 수 있습니다. 또한 엔진 풀을 사용하는 경우 여러 다중 페이지 문서를 동시에 처리할 수도 있지만, 메모리 사용량이 매우 커질 수 있으며 심하면 “out of memory” 오류가 발생할 수도 있습니다.
많은 수의 단일 페이지 문서를 변환하는 경우입니다. 송장, 계약서, 편지 등을 처리할 때가 이에 해당합니다. 단일 페이지 문서는 서로 의존하지 않고 한 번에 많은 메모리를 필요로 하지 않으므로, 이 경우 병렬 처리를 가장 쉽게 적용할 수 있습니다.
많은 수의 이미지를 처리하면서 그 안에서 필요한 정보를 검색하거나, 다른 방식으로 인식 결과를 활용하는 경우입니다. 이들 대부분을 편집 가능한 형식으로 변환할 필요는 없을 수 있으므로, 합성과 내보내기 속도는 문제가 되지 않습니다. 여러 프로세스에서 수행할 작업은 레이아웃 블록을 순회하고 텍스트 블록의 인식 결과에 액세스하는 것입니다.
내보내기에 병렬 처리를 사용하려면, 이 기능은 PDF로 내보내기(TextOnly 모드 제외)와 PPTX 형식에서만 지원된다는 점에 유의하세요.
여러 페이지로 이루어진 문서를 병렬 처리할 때는 FRDocument 사용을 권장합니다. 추가 인터페이스를 구현할 필요가 없으므로, 다중 처리를 구현하는 가장 간단한 방법입니다. 문서 열기, 전처리, 분석 및 인식은 병렬로 수행됩니다. 문서 합성은 기본 프로세스에서 순차적으로 수행된 후 PDF로 내보내기가 수행되며(TextOnly 모드 제외), PPTX 형식으로의 내보내기는 병렬로 수행됩니다.
일부 source(예: 스캐너)에서 수신되는 다수의 단일 페이지 문서를 처리하려면 BatchProcessor를 권장합니다. 이 방법의 장점은 문서 수를 사전에 알 수 없고, 문서 유형이 서로 다를 수 있으며, 문서가 도착하는 즉시 처리해야 하는 경우에도 사용할 수 있다는 점입니다. 단점은 구현에 더 많은 노력이 필요하다는 점입니다. 파일 어댑터용 인터페이스와 사용자 지정 이미지 source를 구현해야 합니다. 단일 페이지 문서의 경우 각 페이지마다 페이지 합성과 문서 합성이 개별적으로 수행되므로, 모든 처리 단계가 병렬로 수행됩니다.
배치 프로세서를 사용하는 시나리오에서는 병렬 내보내기가 지원되지 않습니다.
다수의 단일 페이지 문서를 병렬로 완전히 처리하려면 COM을 통해 별도 프로세스 방식으로 로드된 엔진 pool을 사용할 수 있습니다. 이 방법은 속도 면에서 가장 효율적이며, 다중 스레딩과 관련된 모든 어려움을 자동으로 해소합니다. ABBYY FineReader Engine 객체에 대한 모든 작업이 COM을 통해 직렬화되기 때문입니다. 하지만 몇 가지 제한 사항이 있습니다.
COM을 사용하므로 FREngine.dll을 등록해야 합니다;
코드가 C++로 작성된 경우, COM을 사용하려면 예를 들어 C#보다 더 많은 정형화된 코드를 작성해야 합니다;
이 경우 처리는 다른 process에서 진행되므로 memory에서 이미지를 열 수 없으며, 각 요청을 다른 process로 전달한 뒤 다시 받아와야 하므로 인식 결과를 반복 조회하는 데 더 많은 시간이 걸립니다;
마지막으로, 여러 엔진 인스턴스를 로드하면 memory 사용량이 더 늘어납니다. 특히 이 경우에는 모든 처리 단계가 병렬로 수행되고 여러 합성 작업이 동시에 진행될 수 있으므로 memory를 더욱 많이 사용합니다.
테스트 머신의 프로세서는 Intel® Core™ i5-4440(3.10 GHz, 물리 코어 4개)이고 RAM은 8GB이며, 동시에 실행된 프로세스 수는 4개입니다. 성능 테스트는 DocumentArchiving_Speed 미리 정의된 프로필 설정을 사용해 영어 이미지 300개를 대상으로 수행되었습니다. 표의 숫자는 분당 처리된 페이지 수를 나타냅니다. “단일 페이지 문서” 및 “하나의 다중 페이지 문서” 시나리오에서는 문서를 PDF 형식으로 내보냅니다.
실행할 프로세스 수는 사용 가능한 물리적 또는 논리적 CPU 코어 수, 라이선스에서 사용할 수 있는 여유 CPU 코어 수, 그리고 문서의 페이지 수에 따라 자동으로 결정됩니다. 다중 처리 모드를 사용하려면 다음과 같이 하십시오.
엔진 객체의 MultiProcessingParams 하위 객체에서 MultiProcessingMode 속성 값을 설정합니다. 이 속성이 MPM_Parallel 또는 MPM_Auto로 설정되어 있고, 문서의 페이지 수와 사용 가능한 CPU 코어 수가 모두 1보다 크면 병렬 처리가 사용됩니다.
RecognitionProcessesCount 속성을 사용하여 실행할 프로세스 수를 조정하고, 필요한 경우 다른 속성 값도 지정합니다.
다중 처리 설정을 마치면 FRDocument에 대한 표준 작업 절차를 그대로 사용할 수 있습니다. ABBYY FineReader Engine은 FRDocument 객체의 다음 메서드 중 하나를 호출하면 여러 인식 프로세스를 자동으로 시작합니다.
문서의 각 페이지마다 새 처리 작업이 생성되며, 이 작업은 인식 프로세스 중 하나에 전달됩니다. 인식 프로세스가 작업을 완료하면 다음 처리 작업을 받습니다. 모든 작업이 처리될 때까지 이 과정이 반복됩니다.
C# 코드
// 문서 만들기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 객체와 함께 다중 처리 인식을 사용할 때의 속도 향상을 보여 주며, 자체 애플리케이션 개발을 시작할 때 활용할 수 있는 구현도 제공합니다.
배치 프로세서가 초기화되면 비동기 인식 프로세스가 시작되고 구성됩니다. 그런 다음 프로세서는 사용자 지정 이미지 소스에서 이미지 파일을 가져옵니다. 이미지 파일의 각 페이지에 대해 새 처리 작업이 생성되고, 이 작업은 인식 프로세스 중 하나로 전달됩니다. 한 파일의 모든 작업이 처리용으로 전달되었지만 모든 인식 프로세스가 사용 중인 것은 아니라면, 소스의 이미지 대기열에서 다음 이미지 파일을 가져와 처리에 넘깁니다. 이 과정은 첫 번째 이미지 페이지가 변환되어 사용자에게 전달될 때까지 계속됩니다. 페이지는 이미지 소스에서 가져온 순서대로 사용자에게 반환됩니다.배치 프로세서로 다중 처리를 구성하려면 다음을 수행합니다.
[선택 사항] 처리를 관리하려면 IAsyncProcessingCallback 인터페이스를 구현합니다. 이 인터페이스의 메서드를 사용하면 오류를 처리하거나 처리를 취소할 수 있습니다.
[선택 사항] 엔진 객체의 하위 객체인 MultiProcessingParams를 사용하여 다중 처리를 설정합니다. 배치 프로세서로 작업하는 경우 기본적으로 병렬 처리가 사용되므로 MultiProcessingMode 속성은 설정할 필요가 없습니다. RecognitionProcessesCount 속성을 사용해 실행할 프로세스 수를 조정하고, 필요한 경우 다른 속성 값도 지정합니다.
이 객체의 Start 메서드를 호출하여 프로세서를 초기화하고 비동기 인식 프로세스를 시작합니다. 이 메서드를 호출할 때 이미지 소스를 지정하고, IAsyncProcessingCallback 인터페이스 참조와 매개변수 객체를 전달할 수 있습니다.
메서드가 0을 반환할 때까지 루프에서 GetNextProcessedPage 메서드를 호출합니다. 이는 소스에 더 이상 이미지가 없고 처리된 모든 이미지가 사용자에게 반환되었음을 의미합니다.
GetNextProcessedPage 메서드가 반환한 페이지는 이 메서드를 다음에 호출하기 전까지만 존재합니다. 따라서 이 페이지를 저장하려면, GetNextProcessedPage 메서드를 다음에 호출하기 전에 FRPage 객체의 메서드를 사용해 저장하거나 IFRDocument::AddPage 메서드를 사용해 기존 문서에 추가해야 합니다.
C# 코드
// 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 샘플과, 배치 프로세서에서 다중 프로세스 인식을 사용할 때 속도가 얼마나 향상되는지 보여 주는 BatchProcessingRecognition 데모 도구가 포함되어 있습니다.
이 다중 처리 시나리오에서는 별도 프로세스에 로드된 여러 엔진 인스턴스를 사용합니다. 각 작업자 스레드 내부의 절차는 단일 스레드 처리와 거의 동일할 수 있습니다. 하지만 각 이미지가 정확히 한 번만 처리되도록 보장하기 위해, 어떤 형태로든 동기화 객체를 사용해 이미지를 스레드에 분배하는 사용자 지정 이미지 소스를 구현하는 것이 좋습니다.엔진 객체를 별도 프로세스에 로드하려면 IEngineLoader 인터페이스를 구현하는 OutprocLoader 객체를 사용합니다. 특수 계정과 함께 사용하는 경우, 해당 계정으로 OutprocLoader를 실행하려면 권한이 필요할 수 있습니다.
C# 코드
// 각 스레드에 대해 별도의 OutprocLoader 객체를 만들고 Engine 인스턴스를 로드합니다IEngineLoader engineLoader = new FREngine.OutprocLoader();IEngine engine = engineLoader.InitializeEngine( customerProjectId, LicensePath, LicensePassword, "", "", false );// 별도 process에서 Engine을 가져왔습니다try { ...} finally { engineLoader.ExplicitlyUnload(); // 더 이상 필요하지 않으면 언로드할 수 있습니다 engineLoader = null; GC.Collect(); GC.WaitForPendingFinalizers();}
또한 IHostProcessControl 인터페이스를 사용하여 호스트 process의 우선순위를 관리하고 해당 process의 실행 상태를 제어할 수 있습니다.
계정 권한은 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를 클릭합니다. dialog box가 열리면 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>"
엔진을 별도 프로세스 서버로 구현하는 경우, MultiProcessingParams 객체의 MultiProcessingMode 속성을 MPM_Sequential로 설정해 문서 처리를 순차 모드로 지정합니다.
ABBYY FineReader Engine 배포 패키지에는 EnginesPool 샘플이 포함되어 있으며, 이 샘플은 엔진 풀 사용 시 속도가 얼마나 향상되는지 보여 주고 바로 사용할 수 있는 구현도 제공합니다. 따라서 자체 애플리케이션 개발의 출발점으로 활용할 수 있습니다. 사용자 지정 이미지 소스 구현, 예외 처리, CPU 코어 사용량 제어에 대한 자세한 내용은 이 샘플의 소스 코드를 참조하십시오.