最適化を考慮することは、大容量のレポート(100ページを優に超える)を出力する場合に、パフォーマンスの面において重要です。ここでは、そのようなレポートで最適な結果を得るためのいくつかの情報を紹介します。特に、Webアプリケーションにおいて、サーバーのメモリが逼迫しないようにするために、以下の点に留意してください。
メモリで考慮すべき事項
- 画像:RTF形式とTIFF形式にエクスポートする場合、大きな画像の使用を制限してください。これらの形式にエクスポートすると、たとえ1つの画像であっても、レポートの全ページに繰り返して出力することで、大量のメモリが使用されるため注意が必要です。これらの形式にエクスポートしない場合やExcel、PDF、HTMLの各形式にエクスポートする場合は、繰り返して画像を出力しても1回だけメモリに保存されるだけです。ただし、重複した画像かどうかを検出するために比較が必要になるため、レポートの生成時間が遅くなります。
- サブレポート:各サブレポートのインスタンスはメモリを消費します。このため、サブレポートを使用したセクションを繰り返すようなレポートを出力する場合は注意してください。たとえば、レポートのDetailセクションが2000回繰り返される場合、Detailセクションに貼り付けたサブレポートのインスタンスは、2000個作成されると考えてください。ネストしたサブレポートはその数のインスタンスを複合します。Detailセクションのように繰り返して出力するセクション内で、サブレポートを使用する必要がある場合、そのセクションのFormatイベント内ではなくレポートのReportStartイベントでインスタンス化してください。それにより、サブレポートは1回だけインスタンス化されメモリの消費を抑えることができます。
- CacheToDisk:DocumentオブジェクトのCacheToDiskプロパティをTrueに設定することで、レポートの生成時間が遅くなりますが、レポート全体がメモリにロードされる代わりにディスクにキャッシュされるため、メモリの消費を抑えることができます。 PDFエクスポートもこの設定を検出し、キャッシュされたレポートを使用してエクスポートします。エクスポートについては、PDFエクスポートのみでこのプロパティが有効に働きます。他のエクスポートの場合は、非常に大きなレポートの生成において、メモリ不足になることがあるので注意してください。また、CacheToDiskプロパティがIsolatedStorageを使用してページのcanvasItemsをディスクに格納することにも注意してください。CacheToDiskプロパティを使用するには、IsolatedStorageFilePermissionを持っている必要があります。
分離ストレージの詳細につきましては、MSDNライブラリ等を参照してください。
- 集計:ヘッダセクションに集計(ページ数やレポート内の集計)を配置すると、CacheToDiskプロパティを使用した大容量レポートの場合に、メモリや描画速度に影響を及ぼします。ActiveReportsが後続のセクションの合計またはページ数を決定するまでヘッダの描画が遅れるため、CacheToDiskによる最適化を実行することができません。影響されるセクションの数が多いほど、描画速度は遅くなり、CacheToDiskの最適化は小さくなります。そのため、グループヘッダセクションのグループ合計はレポートヘッダのレポート合計ほどにはパフォーマンスとメモリに影響しません。
速度で考慮すべき事項
- 画像:複数ページに渡る非常に大きいレポートの各ページ上に、繰り返して同じ画像を出力すると、その画像はメモリの消費を抑えるために一度だけ格納されます。しかし、重複した画像かどうかを検出するために比較が必要になるためパフォーマンスが遅くなります。これは、レポートドキュメント自身の場合だけでなく、Excel、PDF、HTMLの各エクスポートを行う場合も当てはまります。
- 集計:ヘッダセクションに集計(ページ数やレポート内の集計)を配置すると、レポート処理が遅くなります。ActiveReportsは、ヘッダセクションを描画する前に後続のセクションの合計数またはページ数を決定する必要があります。影響されるセクションの数が多いほど、描画速度が遅くなります。そのため、グループヘッダセクションのグループ合計はレポートヘッダのレポート合計ほどにはパフォーマンスとメモリに影響しません。
- CacheToDisk:DocumentオブジェクトのCacheToDiskプロパティがTrueに設定されていないことを確認してください。Trueに設定すると、レポートのロードにかかる時間が長くなります。この設定は大容量メモリを使用する非常に大きいレポートの場合のみに使用する必要があります。これを100ページに満たない小さなレポートで使用すると、実際に使用されるメモリ量が大きくなります。
- ストアドプロシージャ:SELECTステートメントの代わりにストアドプロシージャを使用すると、ActiveReportsによって処理されるレコード数が減るためレポートの処理時間がスピードアップします。SELECT * ステートメントを使用することは、このステートメントによって返されるデータのすべてを実際に使用していない限り、お勧めしません。インデックステーブルなどのデータ検索をスピードアップする他の方法については、データベース管理者に問い合わせてください。
PR