3

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

http://npoi.codeplex.com/

生成文档后,我将其保存到内存流中,并使用 MVC File 帮助器方法返回 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 类没有正确收集垃圾或其他什么的问题吗?那会很奇怪,因为我没有保存任何静态变量(至少在我的代码中没有)。

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

4

2 回答 2

6

处理 != 释放内存。

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

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

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

于 2013-01-04T14:03:49.323 回答
1

如果您遇到内存不足的情况,您可能想查看调用 GC.Collect() 。检查这个 SO 线程以获得对为什么(或为什么不)调用它的一个很好的解释。

GC.Collect()

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

于 2013-01-04T16:46:32.227 回答