2

所以有一段时间我一直在使用 XslCompiledTransform,因为这是微软告诉我需要使用的,因为 XslTransform 已被弃用。最近我不得不将它与具有近 100,000 行的转换一起使用(当然是生成的 xsl)。当我使用我的应用程序时,我很震惊地看到一个 OOM 弹出。不管我做了什么 - OOM 就是我得到的一切......为了咯咯笑,我回到 XslTransform...... 将 XslCompiledTransform 更改为 XslTransform 的完全相同的代码,它工作正常......

谁能告诉我如何解决 OOM - XslCompiledTransform 上是否有一些“swtich”?我不知道您将如何复制确切的问题,但如果有人有任何答案,他们将不胜感激。

谢谢 - 下面的代码:

作品:

XslTransform myXslTransform = new XslTransform();
myXslTransform.Load(xslWith100ThousandLines);
MemoryStream m = new MemoryStream();
myXslTransform.Transform(myXPathDocument, null, m);
m.Flush();
m.Close();

OOM 失败

XslCompiledTransform cxslt = new XslCompiledTransform();
cxslt.Load(xslWith100ThousandLines);
MemoryStream m = new MemoryStream();
cxslt.Transform(myXPathDocument, null, m);
m.Flush();
m.Close();
4

4 回答 4

2

好的,所以现在我想,也许这更像是“微软成为微软”……我预感将目标平台改回“任何 CPU”,关闭我所有打开的 Visual Studio 实例并重新打开我的项目……然后清理,重新编译并重新运行,我再次得到 OOM ......

然后我将目标平台设置回 x86 和低,并没有更多的 OOM!我有很多像这样的 x64 相关问题,将来我一定会在任何帖子中包含它们……通常是由于 x64 造成的……

奇怪......但问题'解决'......:S

于 2009-01-14T13:22:27.953 回答
0

起初,我认为您应该将它作为一个错误提交到 Microsoft Connect,但现在想一想,这并不是一个真正的错误。对于这么大的 XSL 文档,您很可能确实遇到了 OOM 异常。

我仍然会在那里发布它,只是因为我不希望新的 XslCompiledTransform 在 XslTransform 没有失败时失败。

如果结果文档很大,也许可以将文档保存到磁盘上的临时 FileStream 中,然后在处理文档时使用它?

于 2009-01-13T20:56:53.917 回答
0

令人惊讶的是,我的印象是旧的 XslTransform 只是链接到新的 XslCompiledTransoform。

您第一次使用时收到 OOM 吗?请记住,任何已编译的内容(XslCompiledTransoform、XmlSerializer、带有 RegexOptions.Compiled 的 Regex)都会将程序集加载到您的 AppDomain 中。程序集一旦添加到 AppDomain 就无法删除。你有几个选择:

  1. 将程序集加载到另一个 AppDomain 并在完成后删除该 AppDomain。这是相当复杂和困难的。这样做将允许您的应用程序释放已使用的内存。
  2. 创建 XslCompiledTransforms 的缓存。永远不要再次创建转换。这种方式将允许您的应用程序抑制内存使用量的增长。您可能希望事先对 XSL 进行 (hash+base64)/校验和,并将该字符串用作字典中的键。

如果您在设计时生成该 XSLT 文件,那么检索由它创建的程序集并将其与您的应用程序而不是 XSLT 一起打包可能是值得的。如果是在运行时,您将不得不使用上面的选项 (1)。

于 2009-01-14T08:22:16.030 回答
0

好吧...在Windows世界中编程总是一个谜...

我感谢你们俩的回答,但是今天-在尝试复制问题时(在消失了大约 14 小时后),问题已经完全消失了……

我做的唯一不同的事情是将编译器设置为 x86 而不是 x64,现在代码完全按照我预期的方式工作,我比以往任何时候都更加困惑......

让每个人都知道我没疯,这是任务管理器连续两次运行的快照:替代文字

我不确定如何或为什么...但就是这样...

于 2009-01-14T13:16:45.517 回答