メインコンテンツへスキップ
分析、認識、または合成の結果を扱う場合、Documentページやその上のブロックを順に処理する必要が生じることがあります。この場合、表示または編集のためにDocument要素 (たとえばページやブロック) を取得すると、そのデータはメモリに読み込まれ、明示的にアンロードするまで保持される点に注意してください。これにより、「メモリ不足」エラーが発生するおそれがあります。これを防ぐには、以下の推奨事項に従ってください。

Documentのページを順に処理する

FRDocument オブジェクトの処理メソッドを使用すると、Linux および macOS では layout と画像Documentが自動的にディスクへアンロードされます。Windows では、layout と画像Documentを自動的にディスクへ保存することもできますが、この動作は選択した PageFlushingPolicy プロパティの値によって決まります。 ただし、表示または編集のためにDocumentのページとそのブロックを取得した場合、データは自動的にはアンロードも保存もされません。複数のページを表示または編集する場合は、各ページでの作業が終わったら、その都度データをアンロードする必要があります。つまり、FRPage オブジェクトの Flush メソッドを呼び出す必要があります。
Windows で .NET を使用している場合は、GC.Collect と GC.WaitForPendingFinalizers も呼び出す必要があります。
一方、ページを順に処理している間に変更を加えた場合は、それらの変更を保存するために Flush メソッドを呼び出す必要があります。そうしないと、たとえば SaveToFolder や、対応する FRDocument のいずれかのエクスポート メソッドを呼び出したときに、変更内容はフォルダー (またはエクスポートされたDocument) には保存されますが、作業中のオブジェクトからは消えてしまいます。 Windows では、Flush メソッドの動作は IFRDocument::PageFlushingPolicy プロパティの値によって異なります。PageFlushingPolicy の値が PFP_FlushToDisk の場合、このメソッドを呼び出すと layout と画像Documentがディスクへアンロードされます。PFP_Auto の場合は、Document内のページ数が 30 を超えていれば、メソッドの呼び出しによってデータがディスクへアンロードされます。そうでない場合、データはメモリ内に保持されます。PFP_KeepInMemory の場合、データはアンロードされません。これは、小さいDocumentと大きいDocumentの両方を 1 つのソリューションで処理する場合に便利です。同じコードを使って処理できるためです。

Windows サンプル

FREngine.IFRPages pages = document.Pages;
int pagesCount = pages.Count;
for (int i = 0; i < pagesCount; i++)
{
 FREngine.IFRPage page = pages.Item(i);
 // ページを順に処理し、ブロック、段落、文字を操作する
 iteratePage(page);
 // ガベージ コレクターを強制実行して、ページから参照されていないオブジェクトをすべて解放する
 GC.Collect();
 GC.WaitForPendingFinalizers();
 // 未使用のページ データをアンロードする
 // ページが iteratePage() で変更された場合は、変更を保持するために Flush(true) を呼び出す
 page.Flush(true);
 // 変更を保持する必要がない場合は、Flush(false) を呼び出す
 // page.Flush(false);
}
FREngine::IFRPagesPtr pages = document->Pages;
int pagesCount = pages->Count;
for( int i = 0; i < pagesCount; i++ ) {
 FREngine::IFRPagePtr page = pages->Item( i );
 // ページを順に処理し、ブロック、段落、文字を操作する
 iteratePage( page );
 // 未使用のページ データをアンロードする
 // ページが iteratePage() で変更された場合は、変更を保持するために Flush( true ) を呼び出す
 page->Flush( true );
 // 変更を保持する必要がない場合は、Flush(false) を呼び出す
 // page->Flush( false );
}
関連項目 FRDocument テキストの操作