SSIS XML XSLT任务内存不足

时间:2011-12-19 18:23:35

标签: sql-server xml xslt ssis bids

我正在BIDS 2005中开发一个包,该包以针对非常大的输入文件的XML(XSLT)任务开始,并且不断收到以下错误

  

[XML Task]错误:出现以下错误消息时出错:   “抛出了'System.OutOfMemoryException'类型的异常。

我的工作站是Win7 64位 - 16 GIG Ram - i7 8核处理器3.5 gHZ。我在这个过程中运行任务管理器,它在运行期间只使用了大约7.5 GB的ram,直到它因错误而崩溃。我正在运行我的本地SQL 2008 R2 64位实例。该程序包在BIDS中配置为以64位模式运行。我已经搜索了一段时间,但没有发现任何看起来很有希望的东西 - 任何人都遇到这个并解决之前? - 谢谢。

2 个答案:

答案 0 :(得分:4)

众所周知,除非XSLT处理器实现流式传输(不属于W3C XSLT 1.0或XSLT 2.0规范的功能),否则整个解析的XML文档通常保留在可用的RAM中。

对于给定的XML文档字符串大小,计算必要的可用RAM有不同的建议。我知道的是:

RAM ~= 5 * string-size

基于此公式,对于具有50GB字符串大小的XML文档,所需的RAM大约为250GB,这超过可用RAM(16GB)15倍。

您可以尝试使用Saxon 9.4,它提供了一些流媒体扩展。

注意:即使是当前指定的 streaming feature in the W3C XSLT 3.0 WD 也不能保证每个可能的转换都能在流模式下执行 - 事实上,对XSLT转换可能使用的XPath表达式的限制,以保证在流模式下成功执行此转换。

答案 1 :(得分:2)

我实际上找到了一个解决方案。我使用脚本任务代替XML任务来进行转换。它只需要3行代码,并且在包括大型代码在内的所有提要上都能很好地工作。该脚本的示例代码如下:

Imports System
Imports System.Data
Imports System.Math
Imports System.Xml.Xsl
Imports Microsoft.SqlServer.Dts.Runtime

Public Class ScriptMain

Public Sub Main()
        Dim xslt As New XslTransform()

        xslt.Load("C:\VVV XML\your-xml-stylesheet.xsl")
        xslt.Transform("C:\VVV XML\your-source-file.xml", "C:\VVV XML\your-destination-file.xml")

        Dts.TaskResult = Dts.Results.Success
End Sub

End Class