SSIS:大负荷和外部存储异常

时间:2011-12-23 08:41:58

标签: sql-server out-of-memory ssis

我目前正在使用Integration Services(SSIS)将大量XML文件加载到SQL Server数据库中。需要在多个表中分派每个XML文件内容。我使用该进程加载至少10000个xml文件。一切正常,直到加载6000个文件。在6000次处理之后,我总是从我的第一个数据流任务中获得OutOfMemoryException,这是该过程中的第一个。

在此脚本组件中,我只检查XML文件中的值是否已存在于特定数据库表中。如果它存在,我返回匹配的ID,否则,我添加一个新的记录。为了实现它,我使用了Lookup组件。对于内存问题,我使用无缓存选项。然后在匹配的情况下,我在脚本组件中处理返回ID。就像我说的,一切正常,直到处理了大约6000个文件。我得到之后:

Description : System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
at Microsoft.SqlServer.Dts.Pipeline.ScriptComponentHost.HandleUserException(Exception e)
at Microsoft.SqlServer.Dts.Pipeline.ScriptComponentHost.PreExecute()
at Microsoft.SqlServer.Dts.Pipeline.ManagedComponentHost.HostPreExecute(IDTSManagedComponentWrapper100 wrapper)

您是否有一些建议或一些资源来处理SSIS中的性能和内存问题?你遇到过类似的问题吗?你知道这个记忆问题可能来自哪里吗?

谢谢:)

编辑: 以下是针对XSD文件检查XML的代码。你能看到任何内存泄漏吗?

public void Main()
    {
        try
        {
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.Schemas.Add("", Dts.Variables["XSDFilePath"].Value.ToString());
            settings.ValidationType = ValidationType.Schema;

            using (XmlReader reader = XmlReader.Create(Dts.Variables["XMLFilePath"].Value.ToString(), settings))
            {
                XmlDocument document = new XmlDocument();
                document.Load(reader);

                ValidationEventHandler eventHandler = new ValidationEventHandler(XMLValidationHandler);
                document.Validate(eventHandler);
            }

            if (ValidationResult)
            {
                Dts.TaskResult = (int)ScriptResults.Success;
            }
            else
            {
                Dts.TaskResult = (int)ScriptResults.Failure;
            }

        }
        catch (Exception ex)
        {
            Dts.TaskResult = (int)ScriptResults.Failure;
        }
    }


    private void XMLValidationHandler(object sender, ValidationEventArgs e)
    {
        switch (e.Severity)
        {
            case XmlSeverityType.Error:
                Console.WriteLine("Warning {0}", e.Message);
                ValidationResult = false;
                break;
            case XmlSeverityType.Warning:
                Console.WriteLine("Warning {0}", e.Message);
                break;
        }
    }

2 个答案:

答案 0 :(得分:0)

不要使用XMLDocument对象,它会将整个文档加载到内存中,这可能是导致内存问题的原因。请尝试使用XmlValidatingReader

http://msdn.microsoft.com/en-us/library/system.xml.xmlvalidatingreader.aspx

它应该提供更有效的内存使用。

答案 1 :(得分:0)