我有一个重大问题。我们有一个asp.net应用程序,该报告显示现在大约1000行,并且可能长达20,000。不要问我为什么,但是客户端不喜欢分页而不喜欢过滤,他们喜欢在一个页面上看到所有内容。我们明显的问题是它在服务器上的加载,就内存而言(也是客户端浏览器可能崩溃的因素)。
我的问题是:如果我只为此报告提供自定义桌面应用程序,它可以显示成千上万行(通过Web服务或远程处理),它会阻塞服务器吗?在服务器上,IIS的工作进程在asp.net应用程序的情况下基本上会占用内存,但是如果我有这个桌面应用运行分离在应用服务器上调用相同的数据库,这会解决内存问题吗? / p>
答案 0 :(得分:7)
尝试使用延迟加载网格,例如jqGrid:查看此页面上的第三个链接[虚拟滚动]:
http://www.trirand.net/demoaspnet.aspx
网格使用ajax仅加载特定滚动位置的页面上可见的数据。看来并不是一个控制者。如果您必须将此作为ASP.NET页面,那就太好了。
否则,@ jmein建议下载它是一个很好的建议。只需使用适当大小的缓冲区将报告流式传输到Response流。
此外,请阅读IEnumerable<T>
和yield return
语句的使用,以最大限度地减少您在响应中加载到内存中的数据量。
答案 1 :(得分:1)
你能否从数据中创建一个excel文件,这样你就不用担心它了?
答案 2 :(得分:1)
传送机制无关紧要 - 您可以在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();
}
}
}
答案 3 :(得分:0)
如果您设置一个Web服务以返回20K记录并且每个记录为1K,那么这是一个20MB的服务呼叫。我同意Daniel的说法,AJAX延迟加载在这里是为了让你一次获取更小的块。