XslCompiledTransform与XslTransform以及OOM的衡量标准如何?

时间:2009-01-13 20:51:55

标签: c# xslt xslcompiledtransform

所以有一段时间我一直在使用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 个答案:

答案 0 :(得分:2)

好吧,所以现在我想,也许这更像是“微软是微软”......在预感中我将目标平台改回“任何CPU”,关闭所有我的视觉工作室实例打开并重新打开我的项目..我然后清理,重新编译,然后重新获得OOM ......

然后我将目标平台设置回x86并且低,并且不再有OOM!我有很多像这样的x64相关问题,将来我一定会把它们包含在任何帖子中...更多的是因为x64 ...

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

答案 1 :(得分:0)

起初,我认为您应该将其作为错误提交给Microsoft Connect,但现在考虑一下,这不是一个真正的错误。如果XSL文档很大,那么很可能会遇到OOM异常。

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

如果结果文档很大,可能会将文档保存到磁盘上的临时FileStream中,然后在处理文档时从中进行处理?

答案 2 :(得分:0)

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

您是否在第一次使用时获得了OOM?请记住,编译的任何内容(XslCompiledTransoform,XmlSerializer,Regex和RegexOptions.Compiled)都会将程序集加载到AppDomain中。添加到AppDomain后,无法删除程序集。你有几个选择:

  1. 将程序集加载到另一个AppDomain中,并在完成后删除该AppDomain。这是相当复杂和困难的。这样做可以让你的应用程序释放已用的内存。
  2. 创建XslCompiledTransforms的缓存。永远不要再创造变换。这种方式将允许您的应用程序抑制内存使用量的增长。您可能希望事先(hash + base64)/校验和XSL,并将该字符串用作字典中的键。
  3. 如果您在设计时生成该XSLT文件,那么在检索由它创建的程序集并将其与您的应用程序而不是XSLT打包时可能是值得的。如果是在运行时,则必须使用上面的选项(1)。

答案 3 :(得分:0)

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

我感谢你们今天的答案 - 在尝试复制问题的同时(在离开大约14小时后)问题完全消失了......

我唯一不同的做法是将编译器设置为x86而不是x64,现在代码完全按照我预期的开始工作,我比以前更加困惑......

只是这样每个人都知道我并不疯狂,这里是两次连续运行的任务管理器:alt text

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