実際の例を書く時間はありませんが、考えられる解決策の要点を次に示します。
(1) ReportViewer をマークアップで実際に表示しないでください。ReportViewer が大きなレポートを作成する場合、おそらく全体がバイト配列としてメモリ内にあると思います。
(2) 動的に作成し、次のように render を呼び出します。
Viewer.LocalReport.Render(format, "", PageCountMode.Estimate, CreateStream, out warnings);
(3) CreateStream は次のようなデリゲートです。
private Stream CreateStream(string name, string fileNameExtension, Encoding encoding,
string mimeType, bool willSeek)
{
Stream stream = new FileStream(name + "." + fileNameExtension, FileMode.Create);
return stream;
}
したがって、結果はストリーム内のファイルに書き込まれます。DataTable のサイズによっては、依然として OOM 例外が発生する可能性があるため、このタイプの ReportDataSource を使用して、DbDataReader を使用してデータを提供することをお勧めします。
public ReportDataSource(string name, IEnumerable dataSourceValue);
上記の提案のうち、DataTable から DataReader に切り替えるだけでよい可能性があります。