gpt4 book ai didi

asp.net-mvc - 无缓冲输出非常慢

转载 作者:行者123 更新时间:2023-12-02 11:59:02 25 4
gpt4 key购买 nike

我使用中概述的方法从数据库生成一个非常大的 .csv 文件

https://stackoverflow.com/a/13456219/141172

在某种程度上,它工作得很好。当导出的文件太大时,我会收到 OutOfMemoryException

如果我通过修改该代码来关闭输出缓冲,如下所示:

protected override void WriteFile(System.Web.HttpResponseBase response)
{
response.BufferOutput = false; // <--- Added this
this.Content(response.OutputStream);
}

文件下载完成。但是,它比启用输出缓冲时慢几个数量级(在本地主机上使用缓冲 true/false 对同一文件进行测量)。

我知道这会慢一些,但为什么它会慢到相对缓慢?我可以做些什么来提高处理速度吗?

更新

按照评论中的建议,也可以选择使用 File(Stream stream, String contentType)。但是,我不确定如何创建。数据是基于数据库查询动态组装的,并且 MemoryStream 将耗尽连续的物理内存。欢迎提出建议。

更新2

评论中建议交替从数据库读取和写入流会导致性能下降。我修改了代码以在单独的线程中执行流写入(使用生产者/消费者模式)。性能上没有明显差异。

最佳答案

我不知道 ASP.NET 和 IIS 对输出流到底做了什么,但可能使用的 block 太小了。 Hook 一个具有非常大缓冲区(例如 4MB)的 BufferedStream。

根据您的评论,它有效。现在,调低缓冲区大小以节省内存并拥有更小的工作集。适合缓存。

作为一个主观评论,我很失望这是必要的。 IIS 应自动使用正确的缓冲区,这对于 TCP 连接来说非常容易。

从OP编辑

这是从此答案派生的代码

public ActionResult Export()
{
// Domain specific stuff here
return new FileGeneratingResult("MyFile.txt", "text/text",
stream => this.StreamExport(stream), false);
}

private void StreamExport(Stream stream)
{
using (BufferedStream bs = new BufferedStream(stream, 256*1024))
using (StreamWriter sw = new StreamWriter(bs))
foreach (var stuff in MyData())
{
sw.Write(stuff);
}
}

关于asp.net-mvc - 无缓冲输出非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26010915/

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