Задаче SSIS XML XSLT не хватает памяти - PullRequest
2 голосов
/ 19 декабря 2011

Я разрабатываю пакет в BIDS 2005, который начинается с Задачи XML (XSLT) для очень большого входного файла и продолжает получать следующую ошибку

[Задача XML] Ошибка: произошла ошибкасо следующим сообщением об ошибке: «Возникло исключение типа« System.OutOfMemoryException ».

Моя рабочая станция - 64-битная Win7 - 16 GIG Ram - 8-ядерный процессор i7 8 ГГц. Я запускаю диспетчер задач во времяпроцесс, и он получает только около 7,5 гигабайт оперативной памяти, используемых во время выполнения, пока он не завершится с ошибкой. Я работаю на моем локальном экземпляре 64-разрядной SQL 2008 R2. Пакет настроен в BIDS для работы в 64-разрядном режимеЯ некоторое время гуглил, но не нашел ничего, что выглядит многообещающе - кто-нибудь сталкивался с этим и решал раньше? - Спасибо.

Ответы [ 2 ]

4 голосов
/ 19 декабря 2011

Общеизвестно, что если процессор XSLT не реализует потоковую передачу (функция, которая не является частью спецификаций W3C XSLT 1.0 или XSLT 2.0), весь проанализированный XML-документ, как правило, хранится в доступной оперативной памяти.

Существуют различные рекомендации для расчета необходимой доступной оперативной памяти для заданного размера строки XML-документа. Я знаю одно:

RAM ~= 5 * string-size

На основе этой формулы для документа XML с размером строки 50 ГБ необходимая оперативная память составляет около 250 ГБ, что в 15 раз превышает объем доступной ОЗУ (16 ГБ).

Вы можете попробовать использовать Saxon 9.4, который предлагает несколько потоковых расширений.

Примечание : Даже указанная в настоящее время функция потоковой передачи в W3C XSLT 3.0 WD не гарантирует, что каждое возможное преобразование может быть выполнено в потоковом режиме - - на самом деле, существуют существенные ограничения на то, какие выражения XPath может использовать преобразование XSLT, для того чтобы это преобразование гарантировало успешное выполнение в потоковом режиме.

3 голосов
/ 22 декабря 2011

Я действительно нашел разрешение. Я использовал задачу сценария вместо задачи XML, чтобы выполнить преобразование. Требуется всего 3 строки кода, и он очень хорошо работает на всех каналах, включая большие. Пример кода для скрипта следующий:

Imports System
Imports System.Data
Imports System.Math
Imports System.Xml.Xsl
Imports Microsoft.SqlServer.Dts.Runtime

Public Class ScriptMain

Public Sub Main()
        Dim xslt As New XslTransform()

        xslt.Load("C:\VVV XML\your-xml-stylesheet.xsl")
        xslt.Transform("C:\VVV XML\your-source-file.xml", "C:\VVV XML\your-destination-file.xml")

        Dts.TaskResult = Dts.Results.Success
End Sub

End Class
...