我们的应用程序使用 XslCompiledTransform.Transform 函数。如果我们在 32 位模式下运行它,行为是正常的,但是在 64 位模式下运行时,内存消耗会跳得太高(并最终抛出内存异常)。相同的代码,相同的机器 - 一个工作而另一个不工作....有没有人看到类似的问题并有解决方法?
谢谢,
我们的应用程序使用 XslCompiledTransform.Transform 函数。如果我们在 32 位模式下运行它,行为是正常的,但是在 64 位模式下运行时,内存消耗会跳得太高(并最终抛出内存异常)。相同的代码,相同的机器 - 一个工作而另一个不工作....有没有人看到类似的问题并有解决方法?
谢谢,
它实际上是由于分配给线程的内存不足OutOfMemoryException
还是由于分配的内存不足?StackOverflowException
我问是因为我在运行 IIS 的 x64 Web 服务器上遇到了此类问题,因为默认情况下它只分配 256kb 给线程的堆栈。我必须在线程中进行一些较大的转换(如 DocBook 到 XSL-FO),以这种方式为堆栈提供更多空间:
var stackedThread = new Thread(RunXsltWithMoreMemory, 2 * 1024 * 1024);
var threadParameters = ThreadXsltParameters {
InputStream = inputStream; // Source XML
OutputStream = outputStream; // Resultant XML
};
stackedThread.Start(threadParameters);
stackedThread.Join();
我最近遇到了这个问题,并通过使用 xsltc 命令行实用程序编译我的 XSLT 解决了它。
xsltc someXsl.xsl /settings:DTD+,document+,script-
xsltc 命令行实用程序记录在 MSDN 上:http: //msdn.microsoft.com/en-us/library/bb399405.aspx。
然后,一旦您运行了命令行实用程序,就会生成一个程序集,您可以在代码中使用它,如下所示:
xmlTransform.Load(Assembly.Load(assemblyName).GetType(assemblyName));
它似乎也显着提高了转换的性能。
虽然 XslCompiledTransform 在这一点上是古老的技术并且可能不会被大量使用,但我最近在 .NET 4.5 中进行了一些测试,并且似乎已经修复了这个内存消耗错误。
我无法从 Microsoft 找到任何明确的指示(我似乎无法再访问旧的 Connect 错误),但是使用相当复杂的 XSLT(几千行)和大量 xpath 表达式进行测试并没有显示任何异常.NET 4.5 中 64 位进程的内存使用情况。在 .NET 3.5 64 位中执行相同的 XSLT 会立即在 8 GB 机器上跳转到 6.5 GB,并从那里继续上升。
我很好奇其他人是否仍然可以在 64 位 .NET 4.5 中使用 XslCompiledTransform 重现不良的内存使用行为,或者是否知道 Microsoft 的任何与此问题相关的更新。
Known bug - See this:
http://connect.microsoft.com/VisualStudio/feedback/details/508748