最適化を考慮することは、大容量のレポート(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+を使って線を描画した際にも同様に発生します。
関連トピック