生成在ASP.NET中具有100万+行的CSV报告

时间:2010-11-09 21:43:45

标签: c# asp.net

我正在寻求有关生成CSV报告的建议。

我有一个ASP.NET应用程序,可以生成有关结算数据的报告。最近,我注意到当它尝试导出报告文件时,Web应用程序没有响应,并且会抛出OutOfMemory异常或服务器超时异常。

我做的修改是:

  • 将必要的索引放在SQL Server中以更快地获取记录
  • 使用SqlDataReader从SQL Server获取数据
  • 指定提取必要记录所需的条件,而不是在一次通话中获取所有信息。

我还想过限制从数据库返回的最大记录数,但系统需要生成所有信息,无论rowcount返回多大,因为下载的信息对我们客户的财务记录至关重要。

我想知道,可以使用哪些方法/解决方案来呈现在ASP.NET中拥有大量数据的CSV报告?

期待您的回复。

干杯, 安

3 个答案:

答案 0 :(得分:2)

要解决服务器超时异常,我会尝试异步生成报告。因此,当您的应用程序收到生成报告的请求时,它应该启动另一个执行生成的线程并立即返回请求。

然后,您需要另一个页面,让访问者在生成报告后接收报告。

这一切都涉及到应用程序中的更多工作,当然要记录正在生成的报告,并在完成时将它们标记为生成。

至于内存不足异常 - 这是您生成报告的方式所特有的。除非你真的做了一些非常疯狂的事情,否则很少会出现内存异常 - 所以你在CSV生成中消耗了大量内存 - 例如创建大量的字符串对象?确保您使用的是StringBuilder,或者更好的方法是将输出直接流式传输到文件中。

最后提示 - 如果您要提供这样的大文件,请确保在IIS配置中为这些文件类型启用了GZIP或DEFLATE压缩。这将大大减少要交付给客户端的包的大小 - 但是需要花费一些处理时间。

答案 1 :(得分:1)

  

我想知道,可以使用哪些方法/解决方案来呈现在ASP.NET中拥有大量数据的CSV报告?

最好的方法是在ASP.NET中执行此操作。您需要一个单独的进程,至少在ASP应用程序中的一个线程中,但最好卸载到另一个服务器/服务。

答案 2 :(得分:1)

预渲染它们并将它们下载为URI \ files。我发现渲染像这样的大文件需要不在常规Click&等待页面渲染并返回。或者如果它们必须是onclick,那么像开始的Ajax和确定完成百分比的偶然查询要好得多,当100%然后你释放URI。