大規模な XML スプレッドシートを作成する必要がありますが、一度に処理できる限界に達したようです。
分割する方法がわからないので、内部目的でメモリ割り当てを増やす方法があるかどうか知りたいですか?
エラーの原因となっているコードは次のとおりです。
private string RenderViewToString()
{
using (var writer = new StringWriter())
{
var view = ViewEngines.Engines.FindView(_context, _viewName, null).View as RazorView;
var viewDataDictionary = new ViewDataDictionary<TModel>(_model);
var viewCtx = new ViewContext(_context, view, viewDataDictionary, new TempDataDictionary(), writer);
viewCtx.View.Render(viewCtx, writer);
return writer.ToString();
}
}
ユーザーが可能なデータの組み合わせからすべてのデータをダウンロードすることを決定したRender()
場合、データの強化前に、このファイルは約 55 MB になり、Excel ドキュメントに変換されます。列が 2 倍になったので、ライターをレンダリングするコード行は倒れています。
viewCtx.View.Render(viewCtx, writer);
誰かが回避策を持っているか、関連するデータをすべて再コーディングせずに管理可能なチャンクに分割する方法を知っていますか?
ビューモデルからデータを取得し、それ自体が複数のテーブルにまたがる1行から数万行を取り、問題を引き起こしている単一のExcelダウンロードでユーザーがすべてを必要とします。
文字列は次のコードに送信されます。
protected override void WriteFile(HttpResponseBase response)
{
response.Write(RenderViewToString());
}
しかし、文字列を返す必要があるかどうかの全体の問題は、ViewContext.View.Render(ViewContext, TextWriter) が落ちるためにそこまで到達することはないため、無関係です。問題の原因となる比較的小さなファイル (60 MB 以上) が原因で落ちるのですか?
web.config で大きなファイルの使用を許可しようとしましたが (同僚が提案しました)、うまくいきませんでした。
現時点では、ViewContext が大きすぎてレンダリングできないため、組み込みのものを使用せずにレンダリングする方法を見つける必要があります。アイデアはありますか?
- - - 編集 - - -
Joe に大いに感謝します。HttpContext ヘッダーを使用するように IIS を設定していないため、コードを変更しましたが、次のコードでうまくいきました。
HttpContext.Current.Response.Clear();
using (var writer = new StreamWriter(HttpContext.Current.Response.OutputStream))
{
var view = ViewEngines.Engines.FindView(_context, _viewName, null).View
as RazorView;
var viewDataDictionary = new ViewDataDictionary<TModel>(_model);
var viewCtx = new ViewContext(_context,
view, viewDataDictionary, new TempDataDictionary(), writer);
viewCtx.View.Render(viewCtx, writer);
}
return null;
70MB のファイルを問題なく生成できるようになりました。