【问题标题】:IIS memory usage won't go back to normal after generating large document生成大文档后 IIS 内存使用不会恢复正常
【发布时间】:2013-01-04 13:48:26
【问题描述】:

在我的 ASP.NET MVC 应用程序中,我使用 NPOI 框架来生成一个相当大的 excel 文件 (30-100mb)

http://npoi.codeplex.com/

生成文档后,我将其保存到内存流中,并使用 MVC 文件辅助方法返回一个 FileStreamResult

File(Stream fileStream, string contentType, string fileDownloadName)

喜欢这个

HSSFWorkbook document = GenerateExcelWorkBook();

var stream = new MemoryStream();
document.Write(stream);

stream.Flush();
stream.Position = 0;

return File(stream, "application/vnd.ms-exce", "filename.xls");

变量文档是 NPOI 框架中的“HSSFWorkbook”类型

我不明白为什么内存使用率仍然很高,即使在生成文档并且流已返回给用户之后也是如此。 File 方法应在写入响应流后处理流。

如果我再次单击生成链接,内存使用会恢复正常,并随着文档再次生成而开始攀升。

这可能是 NPOI HSSFWorkbook 类没有正确收集垃圾或其他什么的问题吗?那会很奇怪,因为我没有保存任何静态变量(至少在我的代码中没有)。

有人知道为什么内存使用不会恢复正常吗?

【问题讨论】:

    标签: c# asp.net iis memorystream npoi


    【解决方案1】:

    Disposing != 释放内存。

    垃圾收集器会根据需要释放内存,大块可能比小块花费更长的时间。

    您在生成第二份文档时看到的行为证实了我的建议;额外的内存使用会导致“内存压力”,这会触发垃圾收集来清理东西。

    基本上,除非你真的有一些记忆问题,否则不要担心。

    【讨论】:

      【解决方案2】:

      如果您遇到内存不足的情况,您可能希望查看调用 GC.Collect()。查看这个 SO 线程,了解为什么(或为什么不)调用它。

      GC.Collect()

      我并不是说你应该这样做,只是说它可能值得测试。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-25
        • 1970-01-01
        • 2020-08-09
        • 2018-01-02
        • 2022-01-01
        • 1970-01-01
        相关资源
        最近更新 更多