SSIS使用太多内存将大型(40GB +)XML文件加载到SQL Server表中

时间:2013-12-12 18:26:44

标签: sql-server xml ssis large-files

我需要使用SSIS将单个大型(40GB +)XML文件加载到SQL Server 2012数据库表中。我遇到了问题,因为SSIS似乎试图将整个文档加载到内存而不是流式传输。

以下是我的SSIS包的更多细节。

我创建了一个具有以下属性的XML Source:

  • 数据访问模式:来自变量的XML文件(但可以是XML文件位置)
  • 变量名称:指定计算机中XML文件路径的变量。
  • XSD位置:定义正在读取的XML的XSD路径。

XML结构很简单,只有3个层次级别:

  1. 带有标题信息的根元素
  2. 定义对象集合的一个级别
  3. 定义单个对象(每个对象都有一组固定字段)的叶级别
  4. 我需要为每个叶元素插入一个数据库记录,重复较高层次结构级别的字段。换句话说,我需要展开XML层次结构。

    如何让SSIS流加载数据,而不是尝试将整个文档加载到内存中?

2 个答案:

答案 0 :(得分:4)

XML源始终加载整个文件。它使用XmlDocument来执行此操作(最后我检查过)。

你唯一能做的就是以某种方式拆分文件,然后在数据流中迭代运行每一段文件。

除此之外,您正在考虑创建自定义数据源,这并非易事。它也代表了一段需要维护的严肃代码。

可能有第三方数据源可以执行此操作。大约五年前我不得不写自己的。

答案 1 :(得分:1)

您是否考虑过以较小的块处理文件?

之前我遇到了同样的问题所以我创建了一个脚本组件来处理这个1个大的XML文件到100个较小的XML文件中然后执行forloop并迭代所有较小的XML文件来处理。

要做到这一点,你不能使用StreamReader.ReadLine,因为它仍然会做同样的事情,加载那个非常大的文件,而不是使用System.IO.MemoryMappedFiles这个场景的设计类。

在这里查看http://msdn.microsoft.com/en-us/library/system.io.memorymappedfiles.memorymappedfile.aspx