我使用https://dev59.com/8HNA5IYBdhLWcg3wfN2O#13456219中提到的方法从数据库生成一个非常大的 .csv 文件。
这个方法在某个程度上运行得很好。但当导出文件太大时,会出现OutOfMemoryException
错误。
如果我通过修改代码来关闭输出缓冲区,就可以解决这个问题:
protected override void WriteFile(System.Web.HttpResponseBase response)
{
response.BufferOutput = false; // <--- Added this
this.Content(response.OutputStream);
}
文件下载完成,但是与启用输出缓冲时相比速度要慢几个数量级(在本地主机上对启用/禁用缓冲的同一文件进行了测量)。
我知道它慢了,但为什么会变得如此之慢?有什么方法可以提高处理速度吗?
更新
根据评论中的建议,使用File(Stream stream, String contentType)也是一种选择。然而,我不知道如何创建stream
。数据是基于数据库查询动态组装的,而MemoryStream将耗尽连续的物理内存。欢迎提供建议。
更新2
评论中建议交替从数据库读取和写入流会导致性能下降。我修改了代码,将流写入操作放到一个单独的线程中(使用生产者/消费者模式)。但是性能没有明显的改善。
File(myStream, "text/csv")
不好吗?http://msdn.microsoft.com/en-us/library/dd493017(v=vs.100).aspx - ta.speot.isAction<Stream>
,它允许我提供一个按照结构化方式写入到response.OutputStream
的方法。http://msdn.microsoft.com/en-us/library/system.web.mvc.fileresult.writefile(v=vs.118).aspx - Eric J.