c# - 导出大量数据

标签 c# asp.net export report out-of-memory

这是我的问题..

我们网站上有两种类型的报告,数据显示在网格中,数据立即下载为报告。

这些报告可以包含几年的数据(超过 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/

相关文章:

jquery - Kendo UI 在.net 中导出为 PDF 多页

c# - Delphi DLL 从 C# 返回字符串 ... .NET 4.5 堆损坏但 .NET 4.0 有效?请解释?

c# - xamarin 组件和引用有什么区别?

c# - Windows 上的 Visual Studio Code、C# 支持

c# - 如何解决错误 :the type does not appear to implement microsoft. practices.servicelocation.iservicelocator?

c# - 在 ASP.NET 中从 URL 获取文本

c# - 如何使用/映射数据库 View 来填充包含的集合?

c# - 在 asp.net (C#) 的 SQL 查询中使用变量

python - 导出带有完整数据的图或另存为脚本

PHP 到 MySql 到 CSV 到 Excel UTF-8