> ## Documentation Index
> Fetch the complete documentation index at: https://docs.abbyy.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 文書ページの反復処理

> メモリ不足を起こさずに ABBYY FineReader Engine で文書ページとブロックを反復処理する: FRPage.Flush を呼び出し、PageFlushingPolicy と (.NET では) GC.Collect を使用します。

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

<div id="iterating-document-pages">
  ## 文書ページを順に処理する
</div>

[FRDocument](/ja/fine-reader/engine/api-reference/document-related-objects/frdocument) オブジェクトの処理メソッドを使用すると、Linux および macOS では layout と画像Documentが自動的にディスクへアンロードされます。Windows では、layout と画像Documentを自動的にディスクへ保存することもできますが、この動作は選択した [PageFlushingPolicy](/ja/fine-reader/engine/api-reference/document-related-objects/frdocument#pageflushingpolicy) プロパティの値によって決まります。

ただし、表示または編集のために文書ページとそのブロックを取得した場合、データは自動的にはアンロードも保存もされません。複数のページを表示または編集する場合は、各ページでの作業が終わったら、その都度データをアンロードする必要があります。つまり、FRPage オブジェクトの [Flush](/ja/fine-reader/engine/api-reference/document-related-objects/frpage/flush-method) メソッドを呼び出す必要があります。

<Note>
  Windows で .NET を使用している場合は、GC.Collect と GC.WaitForPendingFinalizers も呼び出す必要があります。
</Note>

一方、ページを順に処理している間に変更を加えた場合は、それらの変更を保存するために [Flush](/ja/fine-reader/engine/api-reference/document-related-objects/frpage/flush-method) メソッドを呼び出す必要があります。そうしないと、たとえば [SaveToFolder](/ja/fine-reader/engine/api-reference/document-related-objects/frdocument/savetofolder-method) や、対応する [FRDocument](/ja/fine-reader/engine/api-reference/document-related-objects/frdocument) のいずれかのエクスポート メソッドを呼び出したときに、変更内容はフォルダー (またはエクスポートされたDocument) には保存されますが、作業中のオブジェクトからは消えてしまいます。

Windows では、Flush メソッドの動作は [IFRDocument::PageFlushingPolicy](/ja/fine-reader/engine/api-reference/document-related-objects/frdocument#pageflushingpolicy) プロパティの値によって異なります。PageFlushingPolicy の値が [PFP\_FlushToDisk](/ja/fine-reader/engine/api-reference/enumerations/pageflushingpolicyenum#pfp_flushtodisk) の場合、このメソッドを呼び出すと layout と画像Documentがディスクへアンロードされます。[PFP\_Auto](/ja/fine-reader/engine/api-reference/enumerations/pageflushingpolicyenum#pfp_auto) の場合は、Document内のページ数が 30 を超えていれば、メソッドの呼び出しによってデータがディスクへアンロードされます。そうでない場合、データはメモリ内に保持されます。[PFP\_KeepInMemory](/ja/fine-reader/engine/api-reference/enumerations/pageflushingpolicyenum#pfp_keepinmemory) の場合、データはアンロードされません。これは、小さいDocumentと大きいDocumentの両方を 1 つのソリューションで処理する場合に便利です。同じコードを使って処理できるためです。

<div id="windows-samples">
  ### Windows サンプル
</div>

<Accordion title="C# コード">
  ```csharp theme={null}
  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);
  }
  ```
</Accordion>

<Accordion title="C++ (COM) コード">
  ```cpp theme={null}
  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 );
  }
  ```
</Accordion>

関連項目

[FRDocument](/ja/fine-reader/engine/api-reference/document-related-objects/frdocument)

[テキストの操作](/ja/fine-reader/engine/guided-tour/advanced-techniques/working-with-text)
