【问题标题】:Huge Grid displayed on asp.net page巨大的网格显示在 asp.net 页面上
【发布时间】:2010-08-23 14:48:58
【问题描述】:

我有一个大问题。我们有一个 asp.net 应用程序,它有这个报告,截至目前显示大约 1000 行,并且可能增长到 20,000。不要问我为什么,但是客户端不喜欢分页也不喜欢过滤,他们喜欢在一个页面上查看所有内容。我们明显的问题是它在服务器上的负载,就内存而言(也是客户端浏览器也可能崩溃的因素)。

我的问题是:如果我只为此报告提供一个自定义桌面应用程序,它可以显示成千上万行(通过 Web 服务或远程处理),它会阻塞服务器吗?在服务器上,IIS 的工作进程在 asp.net 应用程序的情况下基本上会占用内存,但是如果我让这个桌面应用程序运行单独调用应用程序服务器上的相同数据库,这会解决内存问题吗?

【问题讨论】:

    标签: c# asp.net web-services remoting


    【解决方案1】:

    尝试使用延迟加载网格,例如 jqGrid:查看此页面上的第三个链接 [虚拟滚动]:

    http://www.trirand.net/demoaspnet.aspx

    网格使用 ajax 仅加载特定滚动位置的页面上可见的数据。看不到 pger 控件。如果您必须将此作为 ASP.NET 页面,那就太好了。

    否则,@jmein 建议将其下载为一个很好的建议。只需使用适当大小的缓冲区将报告流式传输到响应流。

    另外,请阅读IEnumerable<T>yield return 语句的用法,以尽量减少加载到内存中以在响应中流式传输的数据量。

    【讨论】:

    • 如果不是 Excel 电子表格,jqGrid 绝对是一个不错的选择。它可以轻松处理海量数据。但是,当您在网格(例如链接或图像)中包含 html 时,由于每列中数据的长度,它似乎存在问题。我相信是因为它将数据存储在 dom 中的一个数组中,以便稍后用于排序和过滤。如果有人知道这一点,我将不胜感激。
    • 性能问题与检索数据时的缓存有关,所以是的,嵌入式控件可能会严重影响此控件,但值得对此进行测试。有关您的 Excel 建议,请参阅我的回答中的 cmets。
    【解决方案2】:

    你能从数据中创建一个excel文件,这样你就不用担心了吗?

    【讨论】:

    • Excel 是我们正在考虑的一种选择,并且很可能在列表的顶部。它只是我们可能不得不在客户可能不满意的 Excel 表上妥协的设计水平。但它仍然在桌面上!
    【解决方案3】:

    交付机制无关紧要 - 您可以在 asp.net 或桌面应用程序中执行此操作,而不会消耗大量内存。

    一般原则是您需要以的形式访问数据,而不是一次将其全部加载到内存中。当您处理流式数据时,您在任何给定时间只处理结果的一个子集。当您移动到流中的下一条记录时,您表示您已完成上一条记录,因此 .NET 运行时可以回收用于操作它的内存。

    在 C# 中,这意味着使用 DataReader(通常通过 IDbCommand.ExecuteReader 获得)。使用数据读取器直接写入HttpResponse 流的典型片段可能如下所示(尽管您也可以对它们进行数据绑定):

    using(IDataReader reader = dataAccessLayer.GetData()) {
    
        if (! reader.IsClosed) {
    
            // Send writes to the client immediately
            // reader.Read advances the reader to the next record in the 
            // result set and discards the current record
            while (reader.Read()) {
    
                // Do something with the record - this just writes the first 
                // column to the response stream.
                Response.Write(reader[0]);
    
                // Send the content to the client immediately, even if the content
                // is buffered. The only data in memory at any given time is the
                // row you're working on.
                Response.Flush();
            }
        }
    }
    

    【讨论】:

    • 在您的示例中,数据阅读器需要打开,直到用户浏览高度不可接受的数据“块”。我没有看到任何其他方式,该对象必须在内存中填充。不能使用 AJAX,因为客户端现在不想要它。
    • @xeshu - 我不确定你的意思。我建议您只在需要为用户呈现数据时(即,当用户浏览到将显示数据的页面时)打开数据阅读器。
    • 这就是问题所在。用户希望在单个页面上同时查看成千上万行。所以页面将不得不从内存中渲染它的所有行。带有延迟加载的 AJAX 似乎是一个不错的选择,但由于某些原因,我们不能在这个特定项目中使用 AJAX。
    • @xeshu - 你不必必须从内存中渲染所有行。如果您愿意放弃通常的 ASP.NET 页面模型,您可以直接写入响应流,如上所示。 (我更新了代码示例以强调它。)
    【解决方案4】:

    如果您将 Web 服务设置为返回 20K 条记录,而每条记录为 1K,那么这是一个 20MB 的服务调用。我同意 Daniel 的观点,即 AJAX 延迟加载在这里是为了让您一次获取较小的块。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-05
      • 1970-01-01
      • 1970-01-01
      • 2014-02-07
      • 2022-06-10
      • 2019-02-14
      相关资源
      最近更新 更多