Процессор XSLT с эффективным использованием памяти - PullRequest
5 голосов
/ 23 октября 2008

Мне нужен инструмент для выполнения XSLT для очень больших XML-файлов. Чтобы было ясно, мне не нужно ничего проектировать, редактировать или отлаживать XSLT, просто выполнить их. Используемые мной преобразования уже хорошо оптимизированы, но большие файлы приводят к тому, что у инструмента, который я пробовал (Saxon v9.1), заканчивается память.

Ответы [ 10 ]

5 голосов
/ 23 октября 2008

Я нашел хорошее решение: Apache's Xalan C ++ . Он предоставляет сменный диспетчер памяти , позволяющий настроить распределение на основе ввода и преобразования.

Во многих случаях она потребляет на 60% меньше памяти (я смотрю на частные байты), чем другие, которые я пробовал.

3 голосов
/ 24 ноября 2008

Возможно, вы захотите посмотреть STX для потоковых XSLT-подобных преобразований. В качестве альтернативы, я считаю, StAX может хорошо интегрироваться с XSLT через интерфейс Transformer.

2 голосов
/ 24 февраля 2009

Подозреваю, что для Java Saxon так же хорош, как и он, если вам нужно использовать XSLT. Он достаточно эффективен (как процессор, так и память) для больших документов, но сам XSLT, по сути, заставляет создавать и сохранять полное дерево содержимого в памяти, за исключением ограниченного числа случаев. Saxon-SA (платная версия) предположительно имеет расширения, позволяющие использовать преимущества таких «потоковых» случаев, так что, возможно, стоит проверить.

Но лучший совет - разделить содержимое: если вы имеете дело с независимыми записями, просто разделите ввод, используя другие методы (например, используйте Stax! :-))

2 голосов
/ 28 октября 2008

Звучит так, будто вы отсортированы, но часто другим потенциальным подходом является сначала разделить данные. Очевидно, что это работает только с некоторыми преобразованиями (т. Е. Когда разные куски данных могут обрабатываться изолированно от целого), но тогда вы можете использовать простой синтаксический анализатор (а не DOM) для разделения на управляемые части, а затем обрабатывать каждый кусочек отдельно и собрать.

Поскольку я являюсь телом .NET, такие вещи, как XmlReader, могут выполнять чанкинг без DOM; Я уверен, что есть эквиваленты для каждого языка.

Опять же - только для полноты.

[редактировать вопрос] Я не знаю ни одного конкретного имени; возможно Разделяй и властвуй . Для примера; если ваши данные на самом деле представляют собой плоский список похожих объектов, то вы можете просто разделить дочерние элементы первого уровня - то есть, вместо того, чтобы иметь 2M строк, вы разбиваете их на 10 лотов по 200K или 100 лотов по 20K. Я делал это раньше много раз для работы с большими объемами данных (например, загрузка кусков данных [все допустимо] и повторная сборка на сервере, чтобы каждая отдельная загрузка была достаточно маленькой, чтобы быть надежной).

1 голос
/ 12 мая 2011

Похоже, что Saxon 9.2 может дать ответ на вашу проблему. Если ваш документ может быть преобразован без использования предикатов (не ссылающихся ни на одного из элементов текущего узла), вы можете использовать потоковый XSLT. Смотрите эту ссылку

Я сам не пробовал, я просто читаю об этом. Но я надеюсь, что это сработает.

1 голос
/ 23 октября 2008

Это интересный вопрос. XSLT потенциально может быть оптимизирован для пространства, но я ожидаю, что все, кроме самых непонятных реализаций, начнутся с анализа исходного документа в DOM, который должен использовать малое кратное размера документа в памяти.

Если таблица стилей не разработана специально для поддержки однопроходного преобразования, разумная производительность по времени, вероятно, потребует анализа исходного документа в иерархической базе данных на диске.

У меня нет ответа.

1 голос
/ 23 октября 2008

Я обнаружил, что пользовательский инструмент, созданный для запуска XSLT с использованием более ранних версий MSXML, делает его очень быстрым, но также потребляет невероятные объемы памяти и фактически не завершит работу, если он слишком большой. Вы также потеряете некоторые расширенные функциональные возможности XSLT, так как более ранние версии MSXML не поддерживают полный набор функций xpath.

Стоит попробовать, если другие ваши варианты займут слишком много времени.

0 голосов
/ 04 мая 2011

Для .NET вы можете использовать предложение решения в Базе знаний Microsoft: http://support.microsoft.com/kb/307494

XPathDocument srcDoc = new XPathDocument(srcFile);
XslCompiledTransform myXslTransform = new XslCompiledTransform();
myXslTransform.Load(xslFile);
using (XmlWriter destDoc = XmlWriter.Create(destFile))
{
    myXslTransform.Transform(srcDoc, destDoc);
}
0 голосов
/ 24 ноября 2008

Вы используете версию Saxon для Java или порт .Net? Вы можете назначить больше памяти для виртуальной машины Java, на которой работает Saxon, если у вас недостаточно памяти (с помощью параметра командной строки -Xms).

Я также обнаружил, что .Net-версия Saxon исчерпывает память не так легко, как Java-версия.

0 голосов
/ 23 октября 2008

Взгляните на Xselerator

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...