Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SSI可以从中提取数据的最大XML文件是什么?_Xml_Ssis - Fatal编程技术网

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

SSI可以从中提取数据的最大XML文件是什么?,xml,ssis,Xml,Ssis,我们有一个体系结构,使用SSI将XML批处理文件中的数据提取到暂存数据库中进行验证,然后再将其导出到生产环境中 我们在某种程度上控制XML格式,我被要求确定XML批处理文件应包含的最大记录数。基于XML模式和一些示例数据,我可以估计平均记录大小,并从中进行一些预测 然而,从另一个角度来看,我想指出SSIS在处理大型XML文件时的技术局限性 我知道SSI会将XML文档展平并转换为它自己的表格式内存表示形式,所以RAM成为一个明显的限制因素,但比例是多少 可以这样说吗,SSIS需要在可用内存中至少是

我们有一个体系结构,使用SSI将XML批处理文件中的数据提取到暂存数据库中进行验证,然后再将其导出到生产环境中

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

然而,从另一个角度来看,我想指出SSIS在处理大型XML文件时的技术局限性

我知道SSI会将XML文档展平并转换为它自己的表格式内存表示形式,所以RAM成为一个明显的限制因素,但比例是多少

可以这样说吗,SSIS需要在可用内存中至少是您尝试加载的文件大小的2.5倍?假设我有一个32GB的盒子专门用于这个数据加载函数,我的XML文件能有多大

我知道可能还包括其他因素,比如模式的复杂性、嵌套元素的数量等等,但最好有一个起点

没那么简单

首先,请注意SSI会“展平”XML,这样通过XML的每条路径都有一个来自XML源的输出。一个微不足道的例子是

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

这将生成父、子、孙、父子孙注释、父子注释和父注释输出,包括正常和错误输出

我参与的一个项目最初有大约203个输出。我能够扁平化XML模式,只生成19个左右。考虑到每个输出都需要完成自己的处理,这仍然是一个很大的问题

此外,XML任务不能处理1GB或更多的XML。它确实会将整个文档加载到内存中。试着加载这样一个文件,看看会发生什么——SSI就是这样

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

更多的乐趣取决于您想对结果数据做什么。在我的例子中,我们必须将每个输出发送到暂存表。这不是一件坏事,但您必须认识到输出中的数据是异步的。单个子元素(带有子元素)将一次到达一点输出路径的末端,并且您永远不会知道所有子元素何时完成处理。这使得不可能在事务的基础上一次处理一个元素


相反,SSIS向每个子元素添加了一个代理键(我想这就是它的名称)。将有一个ParentID添加到父级,一个ChildID添加到子级,还有一个ChildParentID也添加到子级,以引用子级的父级。这些可以用于“重新组合元素”,但只有在所有数据都已写入暂存表之后。这是唯一一次您可以确保任何给定元素都已被完整处理——当它们都已被处理时

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

例如,这家伙导出了整个维基百科内容(20Gb XML文件):


当然,您可能会使用这些数据做一些事情,例如,连接来自XML源的多个流。根据您的需要,您可能需要大量内存,因为某些转换确实会将整个数据集保存在内存中,或者如果您有足够的内存来存储整个数据集,则执行效果会更好。

XML任务的限制不适用于使用XML源提取数据,这不适用于XmlDocument.Load.抱歉;记错了。我们尝试使用XML任务来扁平化XML。它不起作用,然后必须编写自定义源代码来完成这两项工作。