jae*_*kie 5 c# asp.net export report out-of-memory
这是我的问题。
我们的站点中有两种报告类型,数据显示在网格中,数据立即下载为报告。
这些报告可以包含几年的数据(超过1百万行),我们一直允许我们的客户根据日期范围下载数据,但是我们已经开始限制他们可以查看数据的时间,以防止站点中的性能问题。但是,由于它们正在扩展,因此即使在较小的日期范围内,数据仍然会变得非常大,并且如果它们下载过多,我们的内存将超过几场演出并耗尽内存。
我的问题是,我宁愿不限制他们的数据,所以我试图找到一个好的解决方案,以允许他们下载尽可能多的内容。
我可以通过只返回每页数据来限制他们看到的内容,因此不会出现性能问题,但是下载始终是问题所在。
我研究了异步,但是未能成功使它正常工作,因为在加载数据时会增加内存。
有想法吗?有什么想法吗?有什么建议吗?
代码示例:
//获取数据 SqlConnection con =新的SqlConnection(); SqlCommand cmd =新的SqlCommand(); SqlDataAdapter da; DataSet ds = new DataSet(); con.ConnectionString =“ MyConnectionString”; con.Open(); cmd.Connection = con; cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText =“ MyStoredProc”; da =新的SqlDataAdapter(cmd); da.Fill(ds); con.Close(); StringWriter sw =新的StringWriter(); HtmlTextWriter htw =新的HtmlTextWriter(sw); DataGrid dg = new DataGrid(); dg.DataSource = ds.Tables [0]; dg.DataBind(); dg.RenderControl(htw); Response.ClearContent(); Response.ContentType =“ application / vnd.ms-excel”; Response.AddHeader(“ Content-Disposition”,“ attachment; filename = Report.xls”); Response.Write(sw.ToString()); Response.End();
当我用大约80万行的数据运行它时,我的内存高峰,出现内存不足错误,使情况变得更糟。
我假设数据来自后端数据库。如果是这样,您不应让用户等待此操作完成。这是一个糟糕的 UI 设计,尤其是当内存高达 4GB 时。
我同意其他建议,您应该考虑改进代码和设计,可能有助于减少占用空间。但无论如何,您应该为此拥有类似预定作业架构的东西。
您让用户点击下载搜索/文件,并将其添加到数据库表的队列中。有一个 db/.net 进程来处理这些作业并在服务器上生成正确格式的文件。如果数据相同并且您使用正确的命名约定,则可以在许多用户之间重复使用该文件。然后,用户应该能够转到下载队列页面并查看他已安排的所有下载。完成后,他将能够下载该文件。
如果您有不允许这样做的要求,请发表评论进行解释。
| 归档时间: |
|
| 查看次数: |
3241 次 |
| 最近记录: |