我目前正在使用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;
}
}
答案 0 :(得分:0)
不要使用XMLDocument对象,它会将整个文档加载到内存中,这可能是导致内存问题的原因。请尝试使用XmlValidatingReader
http://msdn.microsoft.com/en-us/library/system.xml.xmlvalidatingreader.aspx
它应该提供更有效的内存使用。
答案 1 :(得分:0)