这是我的问题..
我们网站上有两种类型的报告,数据显示在网格中,数据立即下载为报告。
这些报告可以包含几年的数据(超过 100 万行),我们一直允许我们的客户下载某个日期范围内的数据,但我们已经开始限制他们可以查看数据的时长,以防止出现性能问题我们的网站。然而,即使在很小的日期范围内,数据仍然会变得相当大,因为它们正在扩展,如果下载太多,我们的内存会在几千兆上达到峰值并耗尽内存。
我的问题是,我不想限制他们的数据,所以我想找出一个好的解决方案,让他们可以随心所欲地下载。
我可以通过仅返回每页数据来限制他们看到的内容,这样就不会有性能问题,但下载始终是个问题。
我已经研究过异步,但未能成功地使其发挥作用,因为它会在我加载数据时占用内存。
想法?想法?有什么建议吗?
代码示例:
// Get Data SqlConnection con = new SqlConnection(); SqlCommand cmd = new SqlCommand(); SqlDataAdapter da; DataSet ds = new DataSet(); con.ConnectionString = "MyConnectionString"; con.Open(); cmd.Connection = con; cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "MyStoredProc"; da = new SqlDataAdapter(cmd); da.Fill(ds); con.Close(); StringWriter sw = new StringWriter(); HtmlTextWriter htw = new 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 万行的数据运行它时,我的内存出现峰值,出现内存不足错误,让事情变得更糟......它总是占用 RenderControl 直到完成
最佳答案
我假设数据来自后端数据库。如果是这样,您不应该让用户等待此操作完成。这是一个糟糕的 UI 设计,尤其是当内存可以达到 4GB 时。
我同意其他建议,即您应该考虑改进您的代码和设计以帮助减少占用空间。但无论如何,您应该为此拥有类似预定作业架构的东西。
您让用户在搜索/文件上点击下载,它会被添加到数据库表中的队列中。有一个 db/.net 进程出现并处理这些作业并在服务器上以正确的格式生成文件。如果数据相同并且您使用正确的命名约定,则可以在许多用户之间重复使用该文件。然后用户应该能够转到下载队列页面并查看他已安排的所有下载。完成后,他将能够下载文件。
如果您有不允许您这样做的要求,请发表评论解释。
关于c# - 导出大量数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7687698/