导出大量数据

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万行的数据运行它时,我的内存高峰,出现内存不足错误,使情况变得更糟。

cod*_*net 2

我假设数据来自后端数据库。如果是这样,您不应让用户等待此操作完成。这是一个糟糕的 UI 设计,尤其是当内存高达 4GB 时。

我同意其他建议,您应该考虑改进代码和设计,可能有助于减少占用空间。但无论如何,您应该为此拥有类似预定作业架构的东西。

您让用户点击下载搜索/文件,并将其添加到数据库表的队列中。有一个 db/.net 进程来处理这些作业并在服务器上生成正确格式的文件。如果数据相同并且您使用正确的命名约定,则可以在许多用户之间重复使用该文件。然后,用户应该能够转到下载队列页面并查看他已安排的所有下载。完成后,他将能够下载该文件。

如果您有不允许这样做的要求,请发表评论进行解释。