Sql server SSIS-超大文件(500MB)因OutOfMemory异常而失败

Sql server SSIS-超大文件(500MB)因OutOfMemory异常而失败,sql-server,xml,ssis,Sql Server,Xml,Ssis,我有一个SSIS包,它使用XML数据类型列将数据从非标准XML文件加载到数据库表。我将其称为非标准文件,因为它包含一些无效字符,如我使用脚本任务删除的选项卡,并且其中包含层次标记,这些标记可以用于某些键,而不用于其他键。我曾尝试使用XSLT,但它不起作用,因为所有属性(标记)在SSIS XML源中都显示为单独的输出,而不是单独的输出。因此,我将整个XML文件作为一个单列和一个平面文件来读取。当加载小文件(高达8MB)时,软件包运行正常,但当文件大小较大时,软件包将失败。尝试加载500 MB文件时

我有一个SSIS包,它使用XML数据类型列将数据从非标准XML文件加载到数据库表。我将其称为非标准文件,因为它包含一些无效字符,如我使用脚本任务删除的选项卡,并且其中包含层次标记,这些标记可以用于某些键,而不用于其他键。我曾尝试使用XSLT,但它不起作用,因为所有属性(标记)在SSIS XML源中都显示为单独的输出,而不是单独的输出。因此,我将整个XML文件作为一个单列和一个平面文件来读取。当加载小文件(高达8MB)时,软件包运行正常,但当文件大小较大时,软件包将失败。尝试加载500 MB文件时,由于OutOfMemory错误,脚本任务失败。因此,文件以较小的块发送。现在,脚本任务用于处理90MB的文件,但在DFT中失败,因为SSI只读取XML的一部分,而不是整个文件,因此DFT在目标位置失败。我将MaxbufferRows和DefaultBufferSize分别从默认值10000行和10 MB调整为1和100 MB。我发现平面文件源正在读取8193KB的数据(8388609个字符)

请给我一些建议


注意:我正在从Citrix运行SSIS包。我将整个xml文档存储在一个表中,然后使用.nodes提取要存储在相关stage表中的相关信息。

在脚本任务中,打开以增量方式处理文件,并将其流式传输到SQL Server中的nvarchar(max)或xml列中。不需要在SSIS中加载整个内容


编辑您的问题,使其包含一个精简的文件,包括需要示例时需要进行的转换。

事实上,这是一个巨大的xml文件(大约5亿个字符)。您不能将文件分成更小的块吗?另外,您在哪里运行包,在SSDT中,还是SSIS服务正在运行它?如果是后者,包是否以32位模式运行?我正在Citrix的SSDT中运行包。失败的原始文件大小超过500 MB。该文件在清理步骤(脚本任务删除XML的无效字符)中失败。然后我请求以较小的块发送该文件。发送了一个大小为88 MB的文件,该文件通过了上述脚本任务,但在随后的数据流任务中失败,我将所有文件内容作为单个值(单个XML文档)读取问题是,源只读取XML的一部分,并尝试将其加载到目标表中,从而导致错误。我通过用平面文件替换目标表来检查这一点,因为我无法使用data viewer,因为源平面文件中的DT_TEXT列。SSDT是Visual studio的一部分,它只是一个32位应用程序,所以内存不足并不奇怪(因为它需要将整个文件加载到内存中,以及所有的转换等)。为什么不部署和运行该包呢?SSDT用于开发。您的SQL Server(应该比Citrix会话具有更大的内存处理能力,并且作为64位应用程序运行。这可能不会(实际上可能不会)使用XML文件是因为需要匹配开始/结束标记。@user1443098我不明白为什么不能。@David,我不明白如何在nvarchar列中以增量方式传输数据。如果SSIS以块的形式读取数据(取决于缓冲区大小),在第一次插入后将有多行需要更新。XML数据类型毫无疑问,因为不完整的记录将导致无效的XML。@Shaggy1755我建议在脚本任务中使用ADO.NET streaming专门加载。完全绕过SSIS管道。@DavidBrowne Microsoft OK,假设您正在进行流式处理一个XML文件。至少你需要解析根标记,当然它涵盖了整个文件!所以你的第一次调用需要读取整个内容。流式处理没有帮助