SSIS: большая нагрузка и исключение из памяти - PullRequest
0 голосов
/ 23 декабря 2011

В настоящее время я работаю со службами Integration Services (SSIS) для загрузки большого количества файлов XML в базу данных сервера SQL.Каждое содержимое файла XML должно быть распределено в нескольких таблицах.У меня есть как минимум 10000 XML-файлов для загрузки с использованием процесса.Все работает нормально, пока не загружено 6000 файлов.После обработки 6000 я всегда получал OutOfMemoryException из своей первой задачи потока данных, первой в процессе.

В этом компоненте сценария я просто проверяю, присутствует ли значение из файла XML в определенной таблице базы данных.,Если он присутствует, я возвращаю соответствующий идентификатор, в противном случае я добавляю новую запись.Для этого я использую компонент Lookup.Я использую его с опцией No cache, для памяти.Затем в случае совпадения я обрабатываю идентификатор возврата в компоненте скрипта.Как я уже сказал, все работает нормально, пока не обработано более или менее 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?Сталкивались ли вы с подобной проблемой?У вас есть идея, откуда может возникнуть эта проблема с памятью?

Спасибо:)

РЕДАКТИРОВАТЬ: Вот код для проверки XML с файлом XSD.Вы видите утечку памяти?

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 голосов
/ 06 декабря 2012
0 голосов
/ 31 декабря 2011

Не используйте объект XMLDocument, он загрузит весь документ в память и, вероятно, является причиной вашей проблемы с памятью.Вместо этого попробуйте использовать XmlValidatingReader

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

. Это должно обеспечить более эффективное использование памяти.

...