在生产环境(64 GB RAM)中生成非常大的 XML 文档时出现 OutOfMemory 错误 - 在具有 16 GB RAM 的计算机上进行开发时工作正常

问题描述 投票:0回答:1

我有一个 Web 应用程序,经典 ASP.NET,在具有 64 GB RAM 和 SQL Server 2017 Standard 的 Windwes Server SBE 2016 上运行。

该应用程序内置于VS 2022最新版本。

我需要生成一个非常大的 XML,用于国家要求的财务报告。导出的 XML 会生成一个大约 6-700 MB 的文件。

当我在具有 16 GB RAM 的开发环境中生成此文件(并且运行 VS 2022、Sql Server 2019 Developer、IIS Express 等)时,它可以工作。

但是,在生产中运行它时(Windows server 2016 SBS、IIS 10、Sql Server 2017 Standard),当我尝试生成此 XML 时,大多数时候都会出现内存不足的情况。

为了成功运行它,我必须停止 Sql 服务器并重新启动,并停止 w3w 服务并重新启动。之后我可以生成 xml,一次,也许两次,但随后会出现 OutOfMemory 错误。

服务器没有运行任何繁重的进程,SQL Server是最耗内存的进程,通常需要32 GB(在任务管理器中,如下所示)

这就是内存负载通常的样子

生成 XML 的代码是使用标准 Xml 对象来完成的

var xmlDoc = new XmlDocument();
// Create the root element with the specified namespace
XmlElement rootElement = xmlDoc.CreateElement(nsSAFT, "AuditFile", SAFTNamespace);
// Append the root element to the XmlDocument
xmlDoc.AppendChild(rootElement);
// .... 

请告知如何克服这个问题。


我根据收到的反馈添加更多信息。

从数据创建 XML 对象时会引发 OutOfMemory 异常。 如果我达到完全创建 XmlObject 的程度,则将 Xml 文档返回到客户端工作正常 - XML 被呈现到本地临时文件,然后使用从文件中读取的内存流流式传输到客户端块并写入输出流。

xml iis windows-server xmldocument
1个回答
0
投票

得到答案后,我发现appPool启用了32位应用程序(可能是几年前我们仍在应用程序中使用一些32位dll时留下的,但不再使用了)。

我将其设置为 False,应用程序成功生成了 Xml。

我会再做一些测试,但我感觉这会解决问题。

再次感谢大家的回答

© www.soinside.com 2019 - 2024. All rights reserved.