gpt4 book ai didi

c# - 导出大量数据

转载 作者:太空狗 更新时间:2023-10-29 23:33:56 26 4
gpt4 key购买 nike

这是我的问题..

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

这些报告可以包含几年的数据(超过 100 万行),我们一直允许我们的客户下载某个日期范围内的数据,但我们已经开始限制他们可以查看数据的时长,以防止出现性能问题我们的网站。然而,即使在很小的日期范围内,数据仍然会变得相当大,因为它们正在扩展,如果下载太多,我们的内存会在几千兆上达到峰值并耗尽内存。

我的问题是,我不想限制他们的数据,所以我想找出一个好的解决方案,让他们可以随心所欲地下载。

我可以通过仅返回每页数据来限制他们看到的内容,这样就不会有性能问题,但下载始终是个问题。

我已经研究过异步,但未能成功地使其发挥作用,因为它会在我加载数据时占用内存。

想法?想法?有什么建议吗?

代码示例:

// Get DataSqlConnection 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com