SSIS可以从中提取数据的最大XML文件是什么?

时间:2009-03-26 23:14:33

标签: xml ssis

我们有一个架构,我们使用SSIS将XML批处理文件中的数据导出到临时数据库进行验证,然后再将其导出到生产环境中。

我们在某种程度上控制XML格式,并且我被要求确定XML批处理文件应包含的最大记录数。基于XML模式和一些样本数据,我可以估计平均记录大小并从那里做一些预测。

然而,从另一个角度来看,我想了解SSIS在处理大型XML文件时的技术限制。

我知道SSIS会将XML文档压缩并转换为自己的表格内存表示,因此RAM成为一个明显的限制因素,但其比例是多少?

你能说一下,SSIS需要的东西至少是你试图加载的文件大小的2.5倍,在可用内存中吗?假设我有一个专用于此数据加载功能的32GB盒子,我的XML文件有多大?

我知道可能还有其他因素,例如架构的复杂性,嵌套元素的数量等等,但是有一个起点很好。

2 个答案:

答案 0 :(得分:3)

Xml Source不会将整个文档加载到内存中,而是在从XML文件中读取数据时将数据流输出。因此,如果您正在阅读XML并将其写入例如没有复杂转换的文本文件,你需要相对较少的内存。此外,当XML文件增长时,您需要的内存量(在某个阈值之后)会停止增长 - 因此您可以处理可能无限制的XML文件。

E.g。这家伙导出了整个维基百科内容(20Gb XML文件): http://www.ideaexcursion.com/2009/01/26/import-wikipedia-articles-into-sql-server-with-ssis/

当然,你可能会对这些数据采取一些措施,例如:连接来自XML Source的多个流。根据您的需要,您可能需要大量内存,因为某些转换会将整个数据集保留在内存中,或者如果您有足够的内存用于整个数据集,则执行得更好。

答案 1 :(得分:2)

这不是那么简单。

首先,请注意SSIS“扁平化”XML,以便XML源中的每个路径都有一个XML源输出。

是一个简单的例子

<Parent><Child><Grandchild/></Child></Parent>

将产生三个输出和三个错误输出。情况变得更糟:

<Parent><Child><Grandchild><Notes/></Grandchild><Notes/></Child><Notes/></Parent>

这将生成父,子,孙子,父子孙子笔记,父子笔记和父笔记输出,包括正常输出和错误输出。

我参与的一个项目开始时有大约203个输出。我能够展平XML模式并只生成19个左右。考虑到每个输出都需要完成自己的处理,这仍然很多。

此外,XML Task无法处理1GB或更多的XML。确实,它确实将整个文档加载到内存中。尝试做一个这样的文件的XmlDocument.Load并观察会发生什么 - 这就是SSIS会发生什么。

我必须创建自己的“XML元素源”,它一次处理一个根元素的子元素。这使我能够压缩XML以及处理大型文档(10GB测试文档工作)。

根据您对结果数据的处理方式,更有趣。就我而言,我们必须将每个输出发送到临时表。这不是一件坏事,但你必须意识到输出中的数据是异步的。单个子元素(带有后代)将一次一点地到达输出路径的末尾,并且您永远不会知道所有后代何时完成处理。这使得无法一次一个元素地处理事务处理。

相反,SSIS为每个子元素添加了一个代理键(我认为这就是所谓的)。将父项ID添加到父项,将ChildID添加到子项,并将ChildParentID添加到子项,以引用子项的父项。这些可用于“将元素重新组合在一起”,但仅在所有数据完成写入登台表之后。这是唯一一次可以确定任何给定元素已完全处理 - 当它们所有时都有!