【发布时间】:2011-12-03 00:21:08
【问题描述】:
这是我的问题..
我们的网站中有两种类型的报告,以表格形式显示的数据和作为报告即时下载的数据。
这些报告可能包含几年的数据(1+ 百万行),我们一直允许客户下载某个日期范围内的数据,但我们已经开始限制他们查看数据的时间,以防止出现性能问题我们的网站。但是,即使在很小的日期范围内,数据仍然会变得相当大,因为它们正在扩展,如果它们下载太多,我们的内存会在几场演出中达到峰值并耗尽内存。
我的问题是,我宁愿不限制他们的数据,所以我试图找出一个好的解决方案,让他们想下载多少就下载多少。
我可以通过只返回每页数据来限制他们看到的内容,这样就不会出现性能问题,但下载始终是个问题。
我研究了异步,但未能成功地让它工作,因为它在我加载数据时会占用内存。
想法?想法?有什么建议吗?
代码示例:
// 获取数据 SqlConnection con = new SqlConnection(); SqlCommand cmd = 新的 SqlCommand(); SqlDataAdapter da; 数据集 ds = new DataSet(); con.ConnectionString = "我的连接字符串"; con.Open(); cmd.Connection = con; cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "MyStoredProc"; da = 新的 SqlDataAdapter(cmd); da.填充(ds); con.Close(); StringWriter sw = new StringWriter(); HtmlTextWriter htw = new HtmlTextWriter(sw); 数据网格 dg = 新数据网格(); dg.DataSource = ds.Tables[0]; dg.DataBind(); dg.RenderControl(htw); Response.ClearContent(); Response.ContentType = "应用程序/vnd.ms-excel"; Response.AddHeader("Content-Disposition", "attachment;filename=Report.xls"); Response.Write(sw.ToString()); 响应。结束();当我使用大约 800k 行的数据运行此程序时,我的内存会出现峰值,并且出现内存不足错误,并使事情变得更糟。它总是在 RenderControl 上运行,直到完成
【问题讨论】:
-
为什么不把硬件放在问题上并添加更多的 RAM 棒呢?这些天它们很便宜。
-
这不是一个选项,不能因为内存问题而仅仅增加内存,特别是因为报告通常会飙升至 4GB
标签: c# asp.net export report out-of-memory