所以有一段时间我一直在使用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();
答案 0 :(得分:2)
然后我将目标平台设置回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后,无法删除程序集。你有几个选择:
如果您在设计时生成该XSLT文件,那么在检索由它创建的程序集并将其与您的应用程序而不是XSLT打包时可能是值得的。如果是在运行时,则必须使用上面的选项(1)。
答案 3 :(得分:0)
我感谢你们今天的答案 - 在尝试复制问题的同时(在离开大约14小时后)问题完全消失了......
我唯一不同的做法是将编译器设置为x86而不是x64,现在代码完全按照我预期的开始工作,我比以前更加困惑......
只是这样每个人都知道我并不疯狂,这里是两次连续运行的任务管理器:
我不确定如何或为什么......但是那就是......