最適化を考慮することは、大容量のレポート(100ページを優に超える)を出力する場合に、パフォーマンスの面において重要です。ここでは、そのようなレポートで最適な結果を得るためのいくつかの情報を紹介します。特に、Webアプリケーションにおいて、サーバーのメモリが逼迫しないようにするために、以下の点に留意してください。
メモリで考慮すべき事項
- 画像: RTF形式とTIFF形式にエクスポートする場合、大きな画像の使用を制限してください。これらの形式にエクスポートすると、たとえ1つの画像であっても、レポートの全ページに繰り返して出力することで、大量のメモリが使用されるため注意が必要です。これらの形式にエクスポートしない場合やExcel、PDF、HTMLの各形式にエクスポートする場合は、繰り返して画像を出力しても1回だけメモリに保存されるだけです。ただし、重複した画像かどうかを検出するために比較が必要になるため、レポートの生成時間が遅くなります。
- サブレポート: 各サブレポートのインスタンスはメモリを消費します。このため、サブレポートを使用したセクションを繰り返すようなレポートを出力する場合はご注意ください。 たとえば、レポートのDetailセクションにサブレポートを配置してDetailセクションを2000回繰り返す場合、DetailセクションのFormatイベントでサブレポートをインスタンス化すると、インスタンスは2000個作成されます。 また、ネストしたサブレポートの場合は、その数のインスタンスを複合します。このため、Detailセクションのように繰り返して出力するセクション内でサブレポートを使用する必要がある場合は、そのセクションのFormatイベント内ではなくレポートのReportStartイベントでインスタンス化してください。 これにより、サブレポートは1回だけインスタンス化されメモリの消費を抑えることができます。
- CacheToDisk: DocumentオブジェクトのCacheToDiskプロパティをTrueに設定することで、レポートの生成時間が遅くなりますが、レポート全体がメモリにロードされる代わりにディスクにキャッシュされるため、メモリの消費を抑えることができます。PDFエクスポートもこの設定を検出し、キャッシュされたレポートを使用してエクスポートします。エクスポートについては、PDFエクスポートのみでこのプロパティが有効に働きます。他のエクスポートの場合は、非常に大きなレポートの生成において、メモリ不足になることがあるので注意してください。デフォルトでは、CacheToDiskプロパティはIsolatedStorageを使用するので、IsolatedStorageFilePermissionを持っている必要があります。
CacheToDiskLocationプロパティを使用すると、データキャッシュ領域に分離ストレージではなく物理パスを指定できます。分離ストレージを使用した場合に比べ、使用サイズの制限が無いため、CacheToDiskプロパティをTrueに設定した場合はCacheToDiskLocationプロパティも併せて設定することをお勧めします。
- 集計: ヘッダセクションに集計(ページ数やレポート内の集計)を配置すると、CacheToDiskプロパティを使用した大容量レポートの場合に、メモリや描画速度に影響を及ぼします。ActiveReportsが後続のセクションの合計またはページ数を決定するまでヘッダの描画が遅れるため、CacheToDiskによる最適化を実行することができません。影響されるセクションの数が多いほど、描画速度は遅くなり、CacheToDiskの最適化は小さくなります。そのため、グループヘッダセクションのグループ合計はレポートヘッダのレポート合計ほどにはパフォーマンスとメモリに影響しません。
-
レポートの解放: 次の手順を使用し、レポートインスタンスが使用しているメモリを明示的に解放できます。
- DocumentオブジェクトのDispose()メソッドを呼び出します。
- ReportオブジェクトのDispose()メソッドを呼び出します。
- Reportオブジェクトをnullに設定します。
以下のコードは、レポートインスタンスが使用しているメモリを明示的に解放する処理を示します。
Visual Basic
Visual Basicコード |
コードのコピー
|
rpt.Document.Dispose()
rpt.Dispose()
rpt = Nothing
|
C#
C#コード |
コードのコピー
|
rpt.Document.Dispose();
rpt.Dispose();
rpt = null;
|
速度で考慮すべき事項
- 画像: 複数ページに渡る非常に大きいレポートの各ページ上に、繰り返して同じ画像を出力すると、その画像はメモリの消費を抑えるために一度だけ格納されます。しかし、重複した画像かどうかを検出するために比較が必要になるためパフォーマンスが遅くなります。これは、レポートドキュメント自身の場合だけでく、Excel、PDF、HTMLの各エクスポートを行う場合も当てはまります。
- 集計: ヘッダセクションに集計(ページ数やレポート内の集計)を配置すると、レポート処理が遅くなります。ActiveReportsは、ヘッダセクションを描画する前に後続のセクションの合計数またはページ数を決定する必要があります。影響されるセクションの数が多いほど、描画速度が遅くなります。そのため、グループヘッダセクションのグループ合計はレポートヘッダのレポート合計ほどにはパフォーマンスとメモリに影響しません。
- CacheToDisk: DocumentオブジェクトのCacheToDiskプロパティがTrueに設定されていないことを確認してください。Trueに設定すると、レポートのロードにかかる時間が長くなります。この設定は大容量メモリを使用する非常に大きいレポートの場合のみに使用する必要があります。これを100ページに満たない小さなレポートで使用すると、実際に使用されるメモリ量が大きくなります。
- SELECTステートメント: SELECTステートメントの代わりにストアドプロシージャを使用すると、ActiveReportsによって処理されるレコード数が減るためレポートの処理時間がスピードアップします。SELECT * ステートメントを使用することは、このステートメントによって返されるデータのすべてを実際に使用していない限り、お勧めしません。インデックステーブルなどのデータ検索をスピードアップする他の方法については、データベース管理者に問い合わせてください。
印刷で考慮すべき事項
- 仮想プリンタ: Webアプリケーションのように、レポートを生成する環境と表示・印刷する環境が異なる場合は、仮想プリンタを使用することをお勧めします。
- 線種: Lineコントロールを使用して、レポート内に罫線を引いている場合は注意が必要です。LineStyleプロパティがDashやDotなど、デフォルトのSolid以外に設定されていた場合、印刷時のスプールサイズが(Solidと比較して)大きくなるという現象が確認されています。この結果、レポートによってはスプーリングに時間を要してしまい、印刷処理のパフォーマンスが悪化します。この現象は、.NET FrameworkのPrintDocumentにGDI+を使って線を描画した際にも同様に発生します。